Ich erstelle im Wesentlichen mein eigenes Fertigsystem. Spielobjekte werden durch eine vom Menschen lesbare Datendatei definiert. Ich möchte ein leeres GameObject erstellen, es mit den in der Datendatei definierten Komponenten laden und es bereithalten und auf einen Instantiate()
Anruf warten . Wenn ich jedoch GameObject go = new GameObject()
ein neues Spielobjekt verwende, wird es der Szene hinzugefügt.
Mit in Preity integrierten Unity kann ich ein Fertighaus als GameObject laden und es wird nicht zur Szene hinzugefügt. (Siehe Beispiel unten)
Das Grundprinzip dahinter ist, dass ich eine Liste mit GameObjects haben möchte, von denen einige durch Laden von Unity-Prefabs und andere von meinem benutzerdefinierten Prefab-System erstellt wurden. Dies muss zur Laufzeit geschehen und kann den Unity-Editor nicht einbeziehen (da Endbenutzer im Idealfall ihre eigenen Datendateien definieren können).
Wie kann ich ein neues GameObject erstellen, ohne dass Unity es automatisch für mich instanziiert?
Zum Beispiel kann ich einen Anruf wie folgt tätigen:
Resources.LoadAll("PrefabsDirectory", typeof(GameObject))
Und ich bekomme eine Liste von GameObjects, von denen keines der Szene hinzugefügt wird, wenn der Anruf getätigt wird. Im Wesentlichen erstelle ich eine LoadAll
Methode für meine eigenen Prefabs und möchte die GameObjects ebenfalls nicht instanziieren, wenn der Aufruf erfolgt.
quelle
Destroy
das GameObject aufzurufen. Dadurch wird es aus der Szene entfernt und freigegeben, wodurch es unbrauchbar wird.go.SetActive(false)
ist der beste Weg, um so etwas wie einen Objektpool zu erstellen. Es ist nicht genau das, was Sie wollen, aber vielleicht könnten Sie eine kleine Gruppe inaktiver Objekte haben, die später für Ihre benutzerdefinierte Instanziierung geklont werden.Antworten:
Sie könnten die hideFlags des GameObject ändern?
Ich habe gerade versucht, dies auszuführen:
... und es ist da, aber es ist nicht in der Hierarchie. Technisch gesehen ist es in der Szene, aber Sie sehen es erst, wenn Sie die Flags wieder in HideFlags.None ändern. Es ist nicht die Antwort, nach der Sie suchen, aber zumindest was die Freigabe für Entwickler betrifft, ist es sauberer als das Gruppieren Ihrer Objekte.
quelle
Genau das kann man leider nicht. Sie können jedoch dasselbe Entwurfsmuster (dh das Gebäude Ihrer Objekte abstrahieren und sie später einfach mit einem einzigen Befehl aufrufen) über ein Factory-Muster ausführen .
Wenn Sie ein Objekt möchten, rufen Sie so etwas auf
Factory.CreateGameEntity()
, und diese Methode behandelt alles hinter den Kulissen.quelle
GetComponent<>() != null
. Bei meinen Datendateien muss der Parser nach der richtigen Komponente in den Daten suchen. Gleiches gilt für das Abrufen eines Werts aus einer Komponente usw. DieGameObject
Klasse bietet viele Funktionen, die vom Parser dupliziert werden müssen.Es gibt keine Möglichkeit,
go = new GameObject();
ohne es der Szene hinzuzufügen.Ich arbeite an einem RTS, bei dem die Spielerbasis dauerhaft sein muss. Im Wesentlichen serialisieren wir alles, was sie getan haben, und laden es zur Laufzeit mithilfe geänderter Assets aus dem Store wieder ein.
Die meisten werden in XML oder JSON ausgegeben, daher ist es ziemlich einfach, die Datei zu laden und nach Ihren Wünschen zu bearbeiten.
quelle
Der richtige Weg ist, ein Fertighaus zu erstellen. Sie weisen dieses Fertighaus als Objekt zu. Wenn Sie es instanziieren möchten, verwenden Sie einfach die Referenz dieses Objekts und wandeln Sie es als GameObject um.
Ex :
quelle
Um ein Fertighaus in eine Variable zu laden, damit Sie es später instanziieren können, verwenden Sie den folgenden Code:
Ich habe dies in einem Projekt mit Unity 5.5 getan. Es kann instanziiert werden, jedoch nicht in der Szene oder einem Teil der Hierarchie, bis es wie gewohnt instanziiert wird.
quelle