Jump to content
Unity Insider Forum
Kojote

Instantiate

Recommended Posts

Grüße!

Ich hab gleich mal ne Direktfrage an @Sascha. Du hattest vor einigen Monaten mal irgendwo geschrieben, dass Instantiate recht Performance fressend ist, wenn man Objkete initialisieren will. Ich beschäftige mich im Bezug auf meine Ladefunktion gerade mit dem Thema Spawn. Ich finds leider nicht mehr, was war denn noch mal die Alternative zu Instantiate?

Grüße von Zeex

Share this post


Link to post
Share on other sites

Dass etwas Performance braucht heißt nicht automatisch, dass man es nicht benutzen sollte. Wenn du ein neues Objekt mit bestimmten Werten erstellst, müssen diese Werte von irgendwo gelesen werden, und dieser Vorgang des "Deserialisierens", der da passiert, braucht immer ein bisschen. Aber wenn du das nicht über Unity machen lässt, muss es ja trotzdem gemacht werden.

Worauf du dich vermutlich beziehst ist mein Thema zu Pooling. Da werden bereits existerende Objekte recycled, anstatt gelöscht zu werden, und da man dann die Objekte bereits hat, muss man sie nicht noch einmal deserialisieren. Bringt natürlich nur etwas bei Objekten, die oft spawnen und despawnen, wie Schuss-Effekte, Raketen oder Figuren, die im Hintergrund vorbei gehen.

Wenn du einfach nur Dinge in dein Level platzieren willst, nimm Instantiate, spricht nichts gegen.

Share this post


Link to post
Share on other sites

OK, danke für die Antwort.

Malzbie brachte mich gerade in einem anderen Thema auf die Idee, dass sich das erzeugte Objekt selbst seine Daten, die es noch braucht aus meinem Speicherscript holt.

Ich habe eine Liste mit allen Objekten die initialisiert werden sollen. Sagen wir 10 mal Objekt Enemy.

Im Script erzeuge ich also 10 mal das Objekt:

Instantiate(prefab, Vector3, Quaternion);

Problem ist nun, ich hab zwar nen Prefab, kann ihm auch die Position und Quaternion verraten, dann wird das Objekt aber erzeugt und gut. Ich möchte aber allen Prefabs noch verraten, was sie für Variablen haben, unter anderem Animationszustand, Lebenspunkte, Mana, etc.

Wie weiße ich nun dem erzeugten Prefab noch diese Werte zu, ich muss mich ja auf irgendwas beziehen können.

Bisher sieht mein Script so aus:

        public void GameStartObjectInitialization() {
            Debug.Log("Methode \"GameStartObjectInitialization\" muss noch fertig geschrieben werden!");

            // Initialisierung des Spielers bei Spielstart
            for (int i = 0; i < LD_SP_Save_Data_Object_Manager.Instance.characterList.Count; i++) {
                Instantiate(
                    playerPrefab,
                    new Vector3(
                                LD_SP_Save_Data_Object_Manager.Instance.characterList[0].playerPos.x,
                                LD_SP_Save_Data_Object_Manager.Instance.characterList[0].playerPos.y,
                                LD_SP_Save_Data_Object_Manager.Instance.characterList[0].playerPos.z),
                    new Quaternion(
                                LD_SP_Save_Data_Object_Manager.Instance.characterList[0].playerRotation.x,
                                LD_SP_Save_Data_Object_Manager.Instance.characterList[0].playerRotation.y,
                                LD_SP_Save_Data_Object_Manager.Instance.characterList[0].playerRotation.z,
                                LD_SP_Save_Data_Object_Manager.Instance.characterList[0].playerRotation.w)
                    );
            }

            // Initialisierung der Childs bei Spielstart
            for (int i = 0; i < LD_SP_Save_Data_Object_Manager.Instance.characterList.Count; i++) {
            }

            // Initialisierung der Enemys bei Spielstart
            for (int i = 0; i < LD_SP_Save_Data_Object_Manager.Instance.enemyList.Count; i++) {
            }
        }

Ich lege zwar den Player-Prefab fest, aber was mache ich, nach dem das Objekt erstellt wurde. Bei Player ist es ja noch recht einfach, den könnte ich über seinen Tag suchen.

Problematisch wirds dann halt bei Enemy und Child, da können dutzend Objekte existieren, alle haben entweder Child oder Enemy als Tag. Damit fällt die Möglichkeit aus.

EDIT: An manchen Tagen denk ich zu kompliziert:

            for (int i = 0; i < LD_SP_Save_Data_Object_Manager.Instance.characterList.Count; i++) {
                GameObject testGO = Instantiate(
                    playerPrefab,
                    new Vector3(
                                LD_SP_Save_Data_Object_Manager.Instance.characterList[0].playerPos.x,
                                LD_SP_Save_Data_Object_Manager.Instance.characterList[0].playerPos.y,
                                LD_SP_Save_Data_Object_Manager.Instance.characterList[0].playerPos.z),
                    new Quaternion(
                                LD_SP_Save_Data_Object_Manager.Instance.characterList[0].playerRotation.x,
                                LD_SP_Save_Data_Object_Manager.Instance.characterList[0].playerRotation.y,
                                LD_SP_Save_Data_Object_Manager.Instance.characterList[0].playerRotation.z,
                                LD_SP_Save_Data_Object_Manager.Instance.characterList[0].playerRotation.w)
                    );
                testGO.GetComponent<LD_SP_Controller_Player>().mana = 100;
            }

GameObject zuweisen und über die Komponente die Methode zum Laden der Daten ausführen oder wie in dem Fall die Variable ändern.

Share this post


Link to post
Share on other sites

Instantiate gibt dir die Referenz auf die neu erstellte Prefab-Instanz zurück.

var rocket = Instantiate(rocketPrefab);

 

 

  • Thanks 1

Share this post


Link to post
Share on other sites

Ich instanziere in meinem Spiel um die 1.000 Objekte vor dem Laden und bewege mich da bei etwa 1-3 Sekunden.....+ Zuweisungen genauso wie du es benötigst.

Beim Ladevorgang ist das nichts wofür dich ein Benutzer je anklagen wird :)

  • Like 2

Share this post


Link to post
Share on other sites

Also ich kann mal zu meinem jüngsten Erfahrung sagen, dass ich Pooling verwendete habe für Particle Systeme. Ohne das Pooling hatte ich um die 30 Fps, danach ging es auf 60 hoch (ohne FPS Limit um die 200+ FPS). 

Share this post


Link to post
Share on other sites

Dazu ist aber zu sagen, dass Pooling genau dann hilft, wenn oft gleichartige Dinge spawnen und wieder despawnen. Bei einmaligem Spawnen macht Pooling keinen Unterschied.

Share this post


Link to post
Share on other sites
vor 19 Stunden schrieb Sascha:

Dazu ist aber zu sagen, dass Pooling genau dann hilft, wenn oft gleichartige Dinge spawnen und wieder despawnen. Bei einmaligem Spawnen macht Pooling keinen Unterschied.

Aus pers. Interesse: also zb bei Patronenkugeln einer Waffe?

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...