DerStefan Geschrieben 24. September 2020 Melden Share Geschrieben 24. September 2020 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 More sharing options...
Sascha Geschrieben 25. September 2020 Melden Share Geschrieben 25. September 2020 Der Canvas ist auf World Space gestellt? Und das ist auch so gedacht, dass das UI in der 3D-Welt hockt und nicht als Overlay darüber? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Jog Geschrieben 25. September 2020 Melden Share Geschrieben 25. September 2020 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 More sharing options...
Sascha Geschrieben 25. September 2020 Melden Share Geschrieben 25. September 2020 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 More sharing options...
Jog Geschrieben 25. September 2020 Melden Share Geschrieben 25. September 2020 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 More sharing options...
DerStefan Geschrieben 25. September 2020 Autor Melden Share Geschrieben 25. September 2020 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 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 26. September 2020 Melden Share Geschrieben 26. September 2020 Du hast es geschafft, die gestellte Frage geschickt zu umgehen 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: 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 More sharing options...
DerStefan Geschrieben 3. Oktober 2020 Autor Melden Share Geschrieben 3. Oktober 2020 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 More sharing options...
Sascha Geschrieben 4. Oktober 2020 Melden Share Geschrieben 4. Oktober 2020 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 More sharing options...
Jog Geschrieben 4. Oktober 2020 Melden Share Geschrieben 4. Oktober 2020 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 More sharing options...
Sascha Geschrieben 4. Oktober 2020 Melden Share Geschrieben 4. Oktober 2020 Joa, Tippfehler, ich ratter das so runter Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.