Ich bin mit einem Haustierprojekt beschäftigt, bei dem ich versuche, ein Sammelkartenspiel in 3D zu erstellen.
Diese Karten haben HP und Schaden usw., aber ich kann keinen Weg finden, diese Werte ordentlich anzuzeigen. Ich habe versucht, ein TextMesh zu verwenden, aber der gesamte Text verschmilzt nur, wenn sich die Karten überlappen (z. B. wenn die Karten in der Hand sind).
Derzeit verwende ich für jeden Wert eine Ebene und ändere dann das in dieser Ebene verwendete Material, um es an den Wert anzupassen (z. B. ein '3'-Material, wenn der Schaden 3 beträgt). Es funktioniert, aber ich kann nicht umhin zu denken , dass es hat einen besseren Weg zu sein.
Gibt es eine Möglichkeit, Werte in einer Ebene dynamisch anzuzeigen, sodass es so aussieht, als ob der Wert Teil der Karte selbst ist, ohne die Materialien bei jeder Änderung zu ändern? Oder etwas anderes vorschlagen, das meinen Bedürfnissen entspricht?
Wenn ich einen schrecklichen Ansatz verfolge, können Sie mich gerne in eine bessere Richtung bewegen.
Danke im Voraus
Antworten:
Ich weiß nicht, ob dies weniger kostspielig ist, aber mit dem Profiler können Sie es selbst herausfinden. Sie können ein UICanvas an Ihr Kartenobjekt anhängen . Platzieren Sie auf dieser Leinwand Textkomponenten an den richtigen Positionen.
quelle
TextMesh ist der richtige Weg, um das zu finden, wonach Sie suchen, da Sie diese Karten in einer Ebene anzeigen. Diese Komponente wäre bei nicht ebenen Oberflächen keine gültige Wahl.
Fügen Sie Ihrer Karte als Kind ein leeres Spielobjekt hinzu und fügen Sie dann TextMesh als Komponente hinzu -> Komponente / Netz / Textnetz hinzufügen. Gib den Text ein, den du brauchst, und danach musst du den Text an die gewünschte Stelle anpassen und die Position des gameObject verschieben. Beachten Sie, dass der Text deformiert wird, wenn die Vaterobjekte keine 1-1-1-Skala haben. In diesem Fall müssen Sie Ihre Objektorganisation ändern und den Text per Skript verschieben, anstatt ihn als untergeordnetes Objekt zu verwenden.
Wenn Sie die Karte drehen, werden Sie feststellen, dass sich der Text über jedem Netz in der Szene überlappt, sogar über Ihrer eigenen Karte. Um dies zu vermeiden, müssen Sie einen benutzerdefinierten Shader für das "TextMesh" verwenden, mit dem es wie jedes andere Objekt in der Szene gerendert wird.
Dies ist der Shader:
Um den Shader verwenden zu können, benötigen Sie eine Schriftart in Ihrem Projekt. Jeder wird arbeiten. Erstellen Sie ein Material und setzen Sie diesen Shader darauf. Wählen Sie dann die von Ihnen ausgewählte Schriftart aus und weisen Sie ihr im selben Feld "Schrifttextur" des Materials die "Schrifttextur" zu. Dies ist wichtig.
Ändern Sie dann im Spielobjekt mit dem TextMesh die Schriftart in die von Ihnen ausgewählte, genauso wie die, die Sie als Schrifttextur auf das Material gesetzt haben, oder es funktioniert nicht. Wählen Sie in der Komponente MeshRenderer "Materialien -> Element 0" und platzieren Sie das soeben erstellte Material darauf. Jetzt haben Sie einen Text, der sich nicht überlappt. Um die Farbe zu ändern, ändern Sie einfach die Farbe des Materials.
Es ist nicht kompliziert, aber es ist einfach, sich zu vernetzen. Seien Sie also vorsichtig.
PS: Ja, der Text kann außerhalb der Karte liegen, aber wie Sie sehen können, hat sogar Hearthstone einen ähnlichen Ansatz verwendet
quelle