Jump to content
Unity Insider Forum

UI-Text in Cube platzieren


DerStefan

Recommended Posts

Hallo Unity-Experten,

in meiner Beispiel-2D-Szene habe ich zwei Cubes erzeugt, in denen jeweils ein UI-Text-Element vorhanden ist.
Breite und Höhe 60 Px, Größe 40 und vertikal und horizontal zentriert (vom Text).

Befindet sich ein Cube auf x0, y0, ist der Text genau dort, wo er sein muss.
In allen anderen Fällen ist der Text nicht mehr innerhalb des Cubes, obwohl er ein Child-Element ist.
(Anscheinend ist der Text immer auf x0, y0).

In der Hierarchie sieht es so aus:
Main Camera
Cube
- Canvas
-- Text
EventSystem
Cube (1)
- Canvas
-- Text

Wie bekomme ich es hin, dass die Text-Elemente wirklich mit den Cubes verknüpft sind?

P.S: Mit TextMeshPro war es das gleiche Problem.

Danke für jede Hilfe und beste Grüße

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

 

Wie @Sascha schon gesagt hat, muss man den Canvas Render Mode World Space benutzen.

Beim Render Mode World Space  wird der Canvas wie ein normales GameObject behandelt, das heißt man kann ihn skalieren, drehen und in der Szene platzieren, und ist somit nicht mehr an einer festen Bildschirmposition gebunden. Aber daran denken den Canvas-Parameter Event Camera die Kamera zuweisen die das Bild rendert, ansonsten kommt es zu Problemen.

Screen Space - Overlay: Canvas nicht verschiebbar. Controls, Text nur verschiebbar.

Screen Space - Camera: Canvas nicht verschiebbar. Controls, Text  mit räumlicher Tiefe darstellbar.

 

Gruß Jog

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Stunde schrieb Jog:

Wie @Sascha schon gesagt hat, muss man den Canvas Render Mode World Space benutzen.

Naja, das ist halt die Frage. Ich war mir beim Anfangspost halt nicht sicher, ob hier nicht doch von einem Screen Space Canvas die Rede ist. Oder aber sein sollte. Man kann ja auch Text in einem Screen Space Canvas so darstellen, dass er über Objekten der 3D-Welt liegt. Ist auch gar nicht mal so schwer. Von daher, @DerStefan, erzähl doch mal: Was genau versuchst du zu erreichen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

@Sascha Ich hab in so verstanden das sich der Text als Child Objekt des Cubes sich Mitbewegen soll. Das geht halt nur im Mode World Space.

Aber du hast recht, alles nur spekulativ wenn man nicht  genau weiß was er zu erreichen versucht.

 

 Gruß Jog

Link zu diesem Kommentar
Auf anderen Seiten teilen

Vielen Dank für eure Unterstützung.

Ich habe eure Ratschläge umgesetzt und Fortschritte erzielt.
Es gibt aber noch ein paar kleine Unklarheiten:
- warum ist der Text so riesig? (Größe: 40, was eigentlich kein Problem ist)
- der Text befindet sich außerhalb des Sichtfeldes, wenn man PosX und PosY auf 0 hat (siehe Screenshot)

In meiner anderen Beispiel-Szene musste ich noch das Canvas skallieren, was schon mal nicht so günstig war.
Als der Text dann innerhalb der Cubes war, wurde er automatisch vergrößert, als ich die Cubes skallierte.

Mein Wunsch ist es, dass der Text nicht skallierbar ist und sich in seiner Position nicht ändert,
wenn ich den "Father-Cube" skalliere.
Mittels Canvas -> [ ] Canvas Scaler (Komponente im Inspector) konnte ich keine Änderung erreichen.

P.S: Und ja, der Text soll mit den Cubes verschoben werden - wo der Cube ist, soll auch ein Text sein.

P.P.S: Muss ich mit einer 2. Kamera (UI-Kamera) arbeiten, oder reicht es, die MainCamera in das Canvas zu ziehen?

Viele Grüße

Unity_CanvasProblem.png

Unity_CanvasProblem2.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du hast es geschafft, die gestellte Frage geschickt zu umgehen :D

Daher nochmal ganz explizit: Willst du, dass die Zahlen in der 3D-Szene an die Würfel gebunden sind? Als wären die Würfel Bildschirme, die etwas anzeigen? Dann könnte man die auch wegdrehen, etwa so:

grafik.png

Oder willst du in Wirklichkeit einfach nur, dass eine Zahl über jedem Würfel zu sehen ist, die, genau wie Lebensanzeigen in vielen Top-Down-Spielen nichts mit dem Objekt zu tun haben außer ihrer Position? https://i.kinja-img.com/gawker-media/image/upload/t_original/bcjyblk1goennkdlu0rr.png

Ich habe nämlich das Gefühl, dass du eigentlich letzteres willst, und in dem Fall ist die Herangehensweise mit den mehreren World Space-Canvas einfach schonmal komplett falsch. Stattdessen solltest du einen Screen Space-Canvas haben und den UI-Text-Komponenten ein Script geben, das ihre Position z.B. in LateUpdate in Abhängigkeit eines zuweisbaren Zielobjekts setzt. Dafür kannst du z.B. diese Klasse benutzen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Vielen Dank für deine Unterstützung.

Ja, ich meine in der Tat letzteres - also wie bei deinem Spielscreenshot.
In meinem Fall wäre der Text zwar nicht über dem Objekt sondern innerhalb
(aber ist vom Prinzip her das gleiche.)

Falls du dir die Frage stellst, was mein genaues Endergebnis sein soll, sowas hier:
https://www.youtube.com/watch?v=WTq_VhnzBOQ

Die Cubes sind praktisch die Notenbalken und der Text ist die Note.

Die Idee mit der Klasse finde ich super, aber ich will ehrlich sein:
Ich weiß nicht, wie ich die einbinden soll.

Beispiel:
1 Hauptskript, das ich an meine MainCamera binde.
Anschließend instanziiere ich deine Klasse innerhalb des Hauptskripts, um Text-Elemente an Cubes zu positionieren?

Sowas habe ich bisher leider nicht gemacht :(

Ärgerlich, wenn man Ideen und Vorstellungen hat, aber unfähig ist, die einfachsten Sache umzusetzen :(

Wäre dir für jeden Tipp dankbar!

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 15 Stunden schrieb DerStefan:

Sowas habe ich bisher leider nicht gemacht :(

Ärgerlich, wenn man Ideen und Vorstellungen hat, aber unfähig ist, die einfachsten Sache umzusetzen

Joa, Übung macht den Meister ;)

vor 15 Stunden schrieb DerStefan:

Die Idee mit der Klasse finde ich super, aber ich will ehrlich sein:
Ich weiß nicht, wie ich die einbinden soll.

Die Klasse benutzt du z.B. so: Du fügst die Datei in dein Projekt ein, machst ein neues Script, das auf deine UI-Text-Objekte kommt, und etwa so aussehen könnte:

private RectTransform rectTransform;
private Canvas canvas;
public Transform target;


private void Awake()
{
  rectTransform = (RectTransform)transform;
  // Das hier muss evtl. anders aussehen, je nachdem wie deine Hierarchie aussieht:
  canvas = rectTransform.root.GetComponent<Canvas>();
}

private void LateUpdate()
{
  rectTransform.anchoredPosition = canvas.WorldToCanvasPosition(target.position)
}

In "target" kannst du Zielobjekte im Editor reinziehen, aber anderer Code kann da auch werte setzen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Stunden schrieb Sascha:

private void LadteUpdate() { rectTransform.anchoredPosition = canvas.WorldToCanvasPosition(target.position) }

Hallo,

@Sascha Bin etwas verwirrt, ist das eine eigene Methode oder hat der Buchstabenteufel zugeschlagen und es sollte void LateUpdate() heißen?

Gruß Jog

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...