Jump to content
Unity Insider Forum

Skalierung von generierten Objekten


VanFlex

Recommended Posts

Guten Morgen, Grüße zu Ostern in die Runde.

Ich hänge seit mehreren Monaten an einem Problem, für das ich trotz aller Recherche etc. einfach keine Lösung zu finden scheine.

Die Skalierung von Menüs und / oder bestehenden Elementen die zum Szenenstart vorhanden sind, also als Objekt im Editor unterm Canvas hängen, klappt einwandfrei. Was durch den Canvas Scaler ja nun wirklich keine Schweirigkeit ist.

Mein Problem ist folgendes: In einer Szene werden Objekte im Code generiert, die zu Beginn nicht da sind, und auch nicht als Objekt im Editor am Canvas und damit am Scaler hängen.

In der Hauptauflösung (1920 x 1080) sieht alles super aus. Im Editor, auf dem Smartphone. Passt alles schön zusammen.

Sobald aber die Auflösung auf einem anderen Seitenverhältnis läuft (z.B. 2160 x 1080) sieht zwar das Menü etc, also alle Objekte die am Scaler im Editor bereits hängen trotzdem Top aus, aber die Objekte die während der Laufzeit generiert werden skalieren null mit. Es passt nicht.

Ich habe auch schon im Board nach dem Thema Skalierung gesucht, aber so richtig was passendes habe ich nicht entdeckt.

Gibt es eine Möglichkeit die neu generierten Objekte zur Laufzeit via Methode etc. an den Scaler zu hängen so dass die eben auch mit skalieren? So war meine Idee aber umgesetzt bekommen habe ich das noch nicht bis lang.

Vielen Dank schon mal fürs Lesen, und ich bin gespannt was kommt :).

Beste Grüße, bleibt gesund.

Kay

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wie umfangreich sind denn die Objekte, die du generiert / instanzierst? Wenn es nur ein paar sind, kannst du sie doch einfach außerhalb des sichtbaren Bereich parken und bei Gebrauch in das Sichtfeld schieben.

Was sind das für Objekte? UI Elemente, Grafiken (was ja UI Elemente wären), 3D Objekte... ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin! Es kann sein, dass jetzt einiges kommt, was du schon weißt, aber ich fange einfach mal von vorne an. Nur zur Sicherheit... und wenn in Zukunft jemand UI-Probleme hat, kann ich einfach auf diesen Post verweisen :P

Also... wenn er nicht auf "Constant Pixel Size" gestellt ist, sorgt der Canvas Scaler dafür, dass der Canvas immer aspect ratios.jpgeinigermaßen™ gleich groß bleibt. Ansonsten nimmt er Höhe und Breite des Spielfensters an. Meine übliche Konfiguration ist "Scale with Screen Size", eingestellt auf "Match Width Or Height", weil ich meine Grafiken nicht gestreckt haben will. "Match" ist dann ganz nach rechts auf "Height" gezogen. Damit verhält sich der Canvas wie die normale Spielwelt: Die Höhe ist immer gleich, und wenn das Spiel relativ dazu breiter wird, dann nimmt die Kamera halt mehr auf. Siehe Bild rechts: Bei 4:3 werden halt einfach links und rechts Teile abgeschnitten, aber die Höhe bleibt konstant.

Daraus ergibt sich jetzt aber leider, dass sich das UI ändern muss, wenn sich das Seitenverhältnis ändert. Ich nehme an, genau davor sitzt du gerade. Hier gibt es leider keine simple Einstellung, die das Problem löst. Das liegt daran, dass der Computer unmöglich raten kann, was gut aussieht. Schauen wir uns einfach mal Diablo 3 an:

diablo hud.jpg

Hier haben wir die Questanzeige links, eine Minimap rechts oben und das Skillmenü samt Lebensanzeige usw. unten mittig. Dazu noch zwei kleine Knöpfe unten rechts.

Das Skillmenü wird sicherlich unten zentriert bleiben und nicht skalieren. Wird der Bildschirm breiter, bleiben links und rechts einfach mehr Platz. Das Questmenü hat auch eine feste Breite, würde aber im Zweifelsfall sicherlich in der Höhe mitgehen. Ich denke, Questmenü füllt immer die gesamte Höhe aus, minus der Höhe des Skillmenüs. Die Minimap ist einfach oben rechts verankert und verändert seine relative Größe nicht. Wird der Bildschirm breiter, bleibt die Minimap einfach an der rechten Seite kleben und geht mit.

Was ich gerade als Text formuliert habe, kannst du Unity mitgeben, und dann passiert genau so ein verhalten. Dafür musst du dir die RectTransform-Komponente deiner UI-Elemente genauer ansehen. Genauer das Menü, das aufgeht, wenn du oben links auf das quadratische Symbol klickst:

grafik.pngHierbei handelt es sich um den "Anker" (Anchor). Es ist dieselbe Einstellung, die du in Form von 4 Zahlen siehst, wenn du "Anchor" aufklappst. Allerdings ist es viel intuitiver, mit diesem Popup zu arbeiten, und die genauen Zahlenwerte brauchst du eigentlich so gut wie nie.

Dein UI-Element lässt sich also in eine dieser 16 Kategorien einsortierten. Für jeweils die Höhe und die Breite kannst du abgeben, ob auf dieser Achse zentriert werden soll, an eine der jeweiligen beiden Kanten angeklebt werden oder gestreckt werden soll.

Wählst du eine neue Kategorie aus, ändern sich auch die Beschriftungen der Eingabefelder rechts davon in der RectTransform-Komponente. Ein zentriert verankertes Objekt wie im Bild hat z.B. Position, Höhe und Breite. Ein Objekt, das vertikal gestreckt wird, keine vertikale Position oder Höhe mehr, sondern stattdessen jeweils den Abstand nach oben und unten.

Die Questanzeige wäre also ein Kandidat für ganz unten links (vertikal gestreckt, horizontal linksbündig). Der Abstand nach unten würe dann die Höhe des Skillmenüs. Das Skillmenü selbst wäre vermutlich bottom center. Die Minimap top right.

Neben dem Anker kann man sich den Pivot-Punkt nochmal ansehen, der in manchen Situationen besser nicht mittig gesetzt sein sollte. Dafür kann man die Werte der "Pivot"-Einstellung anfassen oder im Anker-Popup mal Shift gedrückt halten. Aber das führt hier eventuell ein bisschen zu weit.

Wenn du jetzt zur Laufzeit Objekte erzeugst, dann musst du weiterhin mit diesen Dingen arbeiten. So nimmt man nicht die position-Eigenschaft, sondern anchoredPosition, wenn man die Position setzen will. Für die Größe des Objekte nicht localScale benutzen, sondern SetSizeWithCurrentAnchors. Von deinem Prefab sollten Anker und Pivot im Vorfeld richtig eingestellt sein.

Und dann kommen da noch die Layout-Komponenten. Wenn du z.B. eine Liste von Dingen hast (und da könnten auch die Knöpfe im Skillmenü in Diablo zuzählen!), dann bietet es sich an, eine LayoutGroup zu benutzen. Wenn du da dann Objekte reinspawnst (also am besten bei Instantiate direkt die LayoutGroup als Parent mitgibst), dann sorgt so eine Komponente dafür, dass Dinge richtig angeordnet werden.

Wenn dir als das nichts hilft, poste doch einfach ein paar Screenshots, vielleicht liegt das Problem ja ganz woanders :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Grüße.

Erst mal vielen Dank für die Antworten. Ich habs jetzt erst geschafft wieder rein zu sehen, da ich dienstlich die Woche doch wesentlich meh runterwegs war als geplant.

chrische5

Das mit dem parent setzen war auch mein Anfang, aber egal wie ich das versuche führt das nur zu Fehlern die ich nicht in den Griff bekomme.

Ich muss dazu sagen, ich programmiere zwar seit Jahren im .Net Bereich, hauptsächlich Desktop-Anwendungen mit Forms, WPF, VB und C#.

Aber das Projekt um das es jetzt geht ist mein erster Einstieg in die Unity Welt.

KaBau

Die Objekte werden per Zufall genereirt. Es gibt eine vordefinierte Auswahl, das ist korrekt, aber die Möglichkeit der Variationen die auftauchen können sind 32. Die könnte man noch im Editor anhängen, aber ich weiß vorher nie wieviele von den einzelnen Varianten dann in einer Spiel-Session auftauchen können etc. Das dann alles vorher anzuhängen... eher nicht.

Ach ja das Spiel ist ein reines 2D Spiel.

Sascha

Mega Beitrag, vielen Dank auch dafür, da muss ich mich morgen früh beim ersten Kaffee mal ran setzen und das durch arbeiten. Ich glaube mir fehlt einfach noch so n gewisses Verständnis zum Zusammenspiel zwischen dem Code, dem Unity-Editor etc.

Nachtrag:

Ich muss auch dazu sagen, das Spiel an sich, in der einen Auflösung in der ich es damals angefangen habe, funktioniert voll umfägnlich. Alle Menüs funktionieren ordentlich. Die Spiel-Bereiche machen was sie sollen und selbst der Multiplayer funktioniert sehr gut.

Einzig diese verflixte Skalierung... aber ich denke mit Eurer Hilfe ist auch das sicher bald erledigt. Ich werde mich morgen ran setzen, das mit dem parent setzen noch mal probieren und mich durch den Beitrag mit der Skalierung arbeiten.

Und dann melde ich mich noch mal. Ich muss mal schauen, vielleicht kann ich Euch mal ein paar Screenshots anhängen oder ein paar Code-Ausschnitte zur Verfügung stellen.

Euch erst mal einen schönen Samstag.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...