Anzeigen von Text in einer 3D-Ebene


7

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


Können Sie ein Beispielbild hinzufügen, wie der Text in Bezug auf die Karte angezeigt wird?
XNargaHuntress

Brauchen Sie wirklich Dinge, um dynamisch zu sein? Soweit ich weiß, können Karten in solchen Spielen normalerweise ihre Werte während des Spiels sowieso nicht ändern.
Maxim Kamalov

Nein, es ist ziemlich routinemäßig, dass Karten ihre Werte während des Spiels ändern. HP
sinkt

Antworten:


0

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.


0

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:

Shader "Text/TextNonOverlap Shader" { 
    Properties {
        _MainTex ("Font Texture", 2D) = "white" {}
        _Color ("Text Color", Color) = (1,1,1,1)
    }

    SubShader {
        Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
        Lighting Off Cull Off ZWrite Off Fog { Mode Off }
        Blend SrcAlpha OneMinusSrcAlpha
        Pass {
            Color [_Color]
            SetTexture [_MainTex] {
                combine primary, texture * primary
            }
        }
    }
}

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

Geben Sie hier die Bildbeschreibung ein


Übrigens, wenn Sie diesen Ansatz verwenden, müssen Sie sich darüber im Klaren sein, dass Sie Ihre Shader anpassen müssen, um zu vermeiden, dass sich der Text über alles überschneidet. Weitere Informationen finden Sie hier: wiki.unity3d.com/index.php?title=3DText
Leucaruth
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.