Jump to content
Unity Insider Forum

Ui in einer eigene Szene


Recommended Posts

Szenen und Prefabs sind schon fast dasselbe. In Godot gibt es den unterschied gar nicht mehr (und sonst ist Godot Unity ja recht ähnlich).

Editieren geht bei beiden Sachen inzwischen gleich gut (da es ja den Prefab Mode gibt, in dem du das Ding einzeln offen hast). Man kann GOs auch problemlos in der Hierarchie ausblenden, dann ist es dir beim Arbeiten in der "eigentlichen" Szene nicht im Weg.

Prefabs haben den Vorteil, dass du sie einfach reinziehen kannst. Es ist kein Code nötig, um zu definieren, welches UI du in welcher Szene haben willst.

Für Szenen brauchst du dagegen Code, auch wenn er sehr kurz sein kann. Aber du musst entweder irgendwie definieren, dass deine Level-Szene das Pause-Menü laden soll, oder du hast deine UI-Szene dauerhaft geladen und musst dann irgendwie definieren, dass das Pause-Menü im Hauptmenü deaktiviert sein soll. In jedem Fall musst du irgendeinen Code schreiben, mit dem du das "hier ja, hier nein" definieren kannst, wie du es bei Prefabs über's Reinziehen machst. Ein Vorteil von Szenen ist, dass man sie sehr einfach asynchron laden kann. Wenn deine Ladezeiten schlecht werden und du den Ladevorgang stückeln willst, dann kannst du eine Szene additiv asynchron laden und dem Spieler irgendeinen Lade-Indikator anzeigen. Instantiate kann das nicht, und meines Wissens nach braucht man immer noch Asset Bundles, um das irgendwie hinzubiegen.

So ein Zwischending wäre es, deine Prefabs über Code nacheinander zu laden, und dabei dann ggf. einen Frame Pause zu machen, damit eine Lade-Animation spielen kann. Wäre nicht wirklich asynchron und genauso unschön wie das mit den Szenen, von daher...

Ich habe keine Ladezeitenprobleme bei meinen persönlichen Projekten gehabt, also hab ich einfach nur das Prefab reingeschmissen und gut war.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ist vielleicht sogar ein Vorteil, dass du das überhaupt kannst. Du kannst relativ einfach deine Prefab-Instanz modifizieren und auf Gegebenheiten der Szene anpassen. So kann das Pause-Menü in einem Dungeon anders aussehen als in der Overworld... oder so. Geht natürlich auch alles wieder mit Szenen, aber so braucht's wieder keinen Extra-Code :)

Das mit der Versuchung musst du natürlich selber wissen... ich kann das für meinen Teil nicht nachvollziehen :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wir haben in der 2d mmo Projekt eine Scene extra für UI, aber das liegt daran, weil wir zwei verschiedene Versionen vom Spiel haben und wir brauchten am Anfang ein für die Clients den Loginscreen. Für den Client brauchen wir den Loginscreen, Anmeldeverfahren und wie und wann die Welten geladen werden sollen. Deswegen fanden wir am besten, dass wir eine vorbereite Scene haben statt ein Prefab.

Vorteil dabei ist, dass wir so oder so per Code alles laden müssten, aber so haben wir eine separate Scene nur für den Client. Das muss beim Server nicht dabei sein.

Wenn wir jetzt nicht dynamisch nach Spielstart Scenen geladen hätten, dann hätte ich eher Prefabs benutzt und dazu die nötigen Scripts.


Aber was der Unterschied zwischen Prefabs und Scenen?

Prefabs sind gameobjects gelagert als Asset. Prefabs können in der Scene platziert werden. Prefabs haben Componenten auf die man ein Referenz aufbauen kann in anderen Componenten. Geht bei Scene nicht und das zu handlen ist auch nicht gerade einfach.
Du kannst auch auf diesen Prefab (also Asset) und auf die Werte aus einem Script zugreifen, kannst theoretisch Funktionen aufrufen (ob es sinn macht oder was bringt ist ne andere Sache :D). Sagen wir mal du hast ein Pooling System und willst nun ein Projektil erneut verwenden.. kannst aus dem Prefab die Daten lesen und die Standardwerte eintragen.

Prefab finde ich aber auch manchmal problematisch.

Ein Beispiel: Ich kann ein Component hinzufügen ohne in den Prefabmode zu gehen, aber es hoch oder zu verschieben erlaubt es nicht, wieso!?. Diese Probleme hab ich bei Scene gar nicht.
2. Beispiel: Bin ich in Prefabmode sehe ich die Objekte in der Scene nicht mehr.. wie soll ich das nun da reinschieben? Multiple Scene geladen kann ich hin und her schieben.

Ich persönlich benutze auch mehrere Canvas. Beispiele:

  • FpsCanvas
  • DamagePopupCanvas
  • FadescreenCanvas
  • UICanvas für standard sachen (Health, Timer, Score, Aktionsleiste usw.

usw.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe immer mehrere Ebenen von UI's. Manche sind Prefabs, manche nicht.

Das Spielemenü ist in der Regel kein Prefab, weil es Dinge zeigt, die nicht im Spiel vorkommen werden. Diese UI liegt also nur in dieser einen Menü-Szene.
Bei meiner Pinball-Collection ist das komplette Menü in einem einzigen Canvas. Was im Nachhinein gesehen gar nicht so gut ist.
Bei meinem neuen Game besteht jeder Menübereich aus einem eigenen Canvas. Das finde ich gut, denn ich kann jedes einzelne Modul unabhängig von den anderen bearbeiten bzw. erstellen. Wenn ich im Game dann einen Menüpunkt auswähle, wird das entsprechende Canvas aktiviert und das Hauptmenü-Canvas deaktiviert. Und beim zurück gehen ins Hauptmenü geht's natürlich anders herum.
Einige der Untermenüs habe ich zu Prefabs gemacht und nutze die dann auch im Spiel selbst.

Im Spiel selbst, sind mehrere UI's, also Canvases. Eins für das Pausemenü und ein paar andere für die Spielerinfos, die man so braucht.
Alle liegen in der Szene gebündelt in einem Empty Gameobject. Dieses Gameobject bietet sich an zum Prefab zu werden, wenn das Spiel aus mehreren Szenen bestünde. Bei mir gibt es aber nur eine Szene.

Bei meinen Flippern ist die ingame UI ein Prefab und jeder Tisch hat dann dieses Prefab in seiner Szene.

Die UI's einmalig bei Spielstart zu erstellen und dann über alle Szenen am Leben zu erhalten sehe ich jetzt nicht als Vorteil an, denn bei mir sind das keine Datencontainer. Meine Daten werden static in einem Sammelscript abgelegt. Das brauche ich eh um relevante Daten zu speichern.
Die UI's additiv hinzu zu laden finde ich auch nicht sehr nützlich, weil man dann im Nachgang möglicherweise diese UI mit anderen UI's oder Objekten verknüpfen müsste.

Das alles bezieht sich auf zweidimensionale UI's, also Overlays.

Dreidimensionale UI's (Canvases) würde ich mit den dazugehörigen Objekten zusammen als Prefab abspeichern, denn die stehen meist direkt mit diesen einzelnen Objekten in Bezug. Ich meine hier speziell irgendwelche Computerterminals, bei denen diese UI's angezeigt werden und mit denen man auch interagiert.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

@malzbie

Der Grund warum ich separiere ist, weil UIs, wenn man etwas dort ändert alles neu geupdatet wird. Performance sinkt dadurch sehr stark. Deswegen sagt man ja auch, dass man Animations bei UIs vermeiden soll, wenn man Performance sparen will. Leute die schwachen PC oder so haben, werden das merken, da alle GOs, die RectTransforms oder CanvasRenderer haben ( eins davon, weiß gerade nicht welches) geupdatet wird. Dies kann aber durch Aufspaltung auf mehrere Canvas optimiert werden. Wenn man zum Beispiel Gegner hat mit Healthbars, die sich ständig ändern, da lohnt sich dann dafür eigenen Canvas zu machen.

Wird hier auch kurz erklärt: https://support.unity.com/hc/en-us/articles/115000355466-Split-canvas-for-dynamic-objects

Manchmal liegt es auch darum, dass ich gern eigenen Canvas mit Prefab vorbereitet haben will für mehrere Projekte. Beispiel FPS Anzeige.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...