Jump to content
Unity Insider Forum

Die y Koordinate des Kindes vom Kind erhalten


Mino1337

Recommended Posts

Hallo,

ich habe folgende Struktur:

Canvas Scrollbar
	scrollrect ScrollRect
		gameobject Content
			gameobject Asset 1
			gameobject Asset 2
			gameobject Asset 3
			gameobject Asset 4
			...

ich erzeuge in meinen Script die "Scrollbar" und muss auf eine Methode von "ScrollRect" zugreifen und benötige die y Koordinate von "Content".

        Canvas SB = new Canvas();
        SB = Instantiate(Scrollbar, new Vector3(0f, -0.1282f,0f), Quaternion.Euler(new Vector3(0, 0, 0)));
        
//Ab hier funktioniert es nichtmehr

ScrollRect = SB.GetComponent<ScrollRect>();
ScrollbarContent = GameObject.Find("/Scrollbar/ScrollRect/Content");
  
//Ab hier gehts wieder
  
...

 

Ich bekomme immer einen Laufzeitfehler weil "ScrollRect" und "ScrollbarContent" nicht gefunden werden.

 

ich habe schon einiges ausprobiert transform.find("ScrollbarContent") zum Beispiel aber nichts hat funktioniert.

 

Wenn mir jemand dabei helfen könnte fände ich das super 😃

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also erstmal kann "new Canvas()" nicht funktionieren, da du keine Komponenten mit "new" erzeugen darfst. Dann überschreibst du in der nächsten Zeile den Inhalt der Variable "SB", warum also überhaupt der Canvas, den du am Ende nicht benutzt?

Dann benutzt du "SB.GetComponent<ScrollRect>()", aber deiner Auflistung oben zufolge ist dein GameObject mit ScrollRect ein Kind des "Scrollbar"-GameObjects. GetComponent ducht nicht in den Kind-Objekten, sondern auf dem Objekt selbst. Zwar gibt es GetComponentInChildren, aber das grundlegende Problem ist hier ein ganz anderes. Dein Instantiate-Script, das du da oben gepostet hast, kennt sich super mit dem Prefab aus, das es instantiieren soll. Wenn dein Prefab sich mal leicht ändert, funktioniert dein Script erstmal nicht mehr. Mal davon abgesehen, dass schon beim ersten Mal schreiben sehr leicht Fehler passieren können.

Bau dir mal ein Script, das du auf dein Scrollbar-Prefab packst. Dieses hat ein paar Felder, in das du die relevanten Objekte deiner ganzen Hierarchie da oben ziehen kannst. Das Script, aus dem der Code-Ausschnitt da oben ist, benutzt dann nur noch die Referenz auf die Instanz dieses Scripts und ruft dort Methoden auf.

Also, so als Beispiel, statt

var instance = Instantiate(prefab, ...);
var someChild = instance.FindSomeChild(...);
someChild.DoStuff();

so etwas auf das Prefab:

public SomeComponent someChild;

public void DoChildStuff()
{
  someChild.DoStuff();
}

und dann beim oberen Script stattdessen

var instance = Instantiate(prefab, ...);
instance.DoChildStuff();

Der Typ des Feldes "prefab" ist dann nicht "GameObject", sondern entspricht des Typs der Komponente auf dem Prefab.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das Ganze hat nach einigen Stolpersteinen ganz wunderbar funktioniert. Vielen Dank dafür =D.

Wie machen das eigentlich andere ? In meinem Spiel gibs verschiedene Bildschirme und wenn man von einem in einen anderen wechselt zerstöre ich per Script alle Prefabs und Instanziere die des neuen Bildschirms. Mein Code hat mittlerweile ca. 10.000 Zeilen. Mach ich da was falsch oder ist das gängige Praxis ? Es funktioniert ja aber irgendwie kommt es mir kompliziert vor.

Auf jedenfall danke für deine Hilfe 😃

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Stunde schrieb Mino1337:

Mein Code hat mittlerweile ca. 10.000 Zeilen. Mach ich da was falsch oder ist das gängige Praxis ?

Das klingt auf jeden Fall ungut. Du solltest eher deine Bildschirme in der Szene über den Editor gestalten, also zusammenklicken, und dann die Root-Objekte deaktiveren oder aktivieren, um nur den/die jeweils richtigen Bildschirm anzuzeigen. Inaktive Dinge zu haben anstatt riesig viel Objekte zu erstellen und zu löschen ist in den allermeisten Fällen eine gute Idee.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...