Jump to content
Unity Insider Forum

Anfängerprobleme mit Panel


bla_92

Recommended Posts

Hallo,

 

ich habe schon etwas im Forum gestöbert, doch noch nciht das richtige gefunden.

Erstmal kurz was ich eigentlich machen möchte:

 

Ich habe eine Klasse Level, in der ich mehrere Objekte einer zweiten Klasse erzeuge.

In der zweien Klasse möchte ich unteranderem die Position eines Panels verändern, welches ich direkt in Unity (also nicht im Script)eingefügt habe. Außerdem erzeuge ich Buttons usw. welche das Panel als Parent erhalte sollen.

Da ich die Aktionen mit dem Panel durch Aufrufen des Konstruktors und nicht durch Aufrufen der Startmethode durchführe, ist (vermute ich) das Panel noch nicht der entsprechenden Variable zugewiesen worden, da es noch nicht erzeugt wurde.

In der Startmethode können die Aktionen nicht ausgeführt werden, da in der Levelklasse über den Konstruktor unterschiedliche Parameter mitgegeben werden (je nach Anwendungsfall).

 

Wie kann ich also dafür sorgen, dass erst alles geladen wird und dann meine Levelklasse ausgeführt wird und diese dann die Objekte erzeugt?

Oder gibt es eine Möglichkeit ein Panel ähnlich wie einen Button mit GameObject.FindWithTag vorher zu finden?

 

Ich bin über jeden Tipp wie ich das Problem angehen könnte oder wo ich neue Ideen finden könnte dankbar.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja, ein Panel ist auch nur ein GameObjekt, welches du beispielsweise über die Methoden "GameObject.Find" oder "GameObject.FindWithTag" (besser) in the Szene suchen kannst. Ich würde aber ehrlich gesagt diese GameObjekt-Verknüpfungen (aus Performancegründen) bereits in den Start()- oder Awake-Methoden erstellen (oder dem Skript über den Inspektor übergeben) und im Nachhinein diese Referenzen mit Parametern (die du aus deinem Klassenkonstruktor übergeben bekommst) modifizieren bzw. initialisieren.

Geht es gar nicht anders, so kann man die Suche zumindest auf die Childs eines Gameobjektes einschränken über die Methode "Transform.Find".

 

Normalerweise sollte ein Suchen in einer Szene nicht notwendig sein, wenn du beispielsweise Szenenobjekte in einer Klasse erzeugst und eine andere Klasse darauf zugreifen möchte, dann wäre es besser eine Verbindung zwischen diesen beiden Klassen herzustellen (Skriptreferenz) und die erzeugten Objekte zu übergeben.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für deine Antwort.

Wenn ich das Panel mit GameObject.FindWithTag suche bekomme ich die Fehlermeldung, dass das GameObject nicht zu einem RectTransform konvertiert werden kann. Als GameObject kann ich es aber nicht mit "button.transform.SetParent(parentPanel, false);" als Parent des Buttons setzen.

 

Ich habe bereits versucht die Verknüpfung mit dem Inspektor zu ergzeugen, doch da ich das Panel mit Hilfe des Konstuktors der Klasse und nicht mir der Startmethode aufrufe kennt Unity das Panel anscheinend noch nicht.

 

Ich möchte auf das Panel lediglich in dieser einen Szene nutzen, doch dadurch, dass ich 4-6 verschiedene Objekte meiner zweiten Klasse erzeuge, welche alle verschiedene Parameter zum Positionieren des Panels erhalten, erzeuge, kann die Start- Methode nicht benutzt werden. So sehe ich das zumindest oder liege ich da falsch?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die Frage ist doch wann der Konstruktor los legt.

Erst kommen alle Awake(), dann alle Start() und erst dann alle Update() Funktionen dran.

Versuchst du etwas in der Start() zu bedienen, was aber erst in der Update() zur Verfügung gestellt wird, kommst du nicht weiter, denn dann warst du mit der Start() einfach zu früh.

Link zu diesem Kommentar
Auf anderen Seiten teilen

In der Startmethode der Levelklasse wird der Konstruktor des zweiten Klasse aufgerufen.

Werden die Verknüfungen die ich mit dem Inspektor der zweiten Klasse zuweise erst zugewiesen wenn ich die Startmethode der zweiten Klasse aufrufe oder geschieht dies schon beim Aufrufen der Startmethode der Levelklasse?

Unity ist echt eine Herausforderung für mich :lol:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die Referenzen aus dem Editor sollten vor Awake und damit vor Start bereits vorhanden sein.

 

Wenn ich das Panel mit GameObject.FindWithTag suche bekomme ich die Fehlermeldung, dass das GameObject nicht zu einem RectTransform konvertiert werden kann.

RectTransform ist eine Subklasse von Transform. Ein GameObject ist kein Transform, sondern hat eine solche Komponente. Du konvertierst also nicht, sondern erfragst:

var go = GameObject.FindWithTag( ... );
var rct = (RectTransform)go.transform;

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...