Mino1337 Geschrieben 25. Februar 2019 Melden Share Geschrieben 25. Februar 2019 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 More sharing options...
Sascha Geschrieben 26. Februar 2019 Melden Share Geschrieben 26. Februar 2019 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 More sharing options...
Mino1337 Geschrieben 26. Februar 2019 Autor Melden Share Geschrieben 26. Februar 2019 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 More sharing options...
Sascha Geschrieben 26. Februar 2019 Melden Share Geschrieben 26. Februar 2019 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 More sharing options...
Mino1337 Geschrieben 27. Februar 2019 Autor Melden Share Geschrieben 27. Februar 2019 Ah, ok. Ich dachte nur das es später auf den Speicher geht wenn ich das so mache aber du hast schon recht, so wie ich es jetzt mache gehts auf den Prozessor. Besten Dank 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.