Du bist nicht angemeldet.

Werbeanzeige

Tris

Frischling

  • »Tris« ist der Autor dieses Themas

Beiträge: 58

Wohnort: Nähe Stuttgart

Beruf: neu kompilierter Fachinformatiker Anwendungsentwickler

  • Private Nachricht senden

1

01.07.2020, 23:42

[UNITY] Performance: viele Components gleichzeitg ansprechen

Hallo zusammen,

ich habe mal wieder eine Frage bezüglich einer Überlegung zu folgender Situation/Problem :huh:


Ausgangssituation:
Typisches TowerDefense Spiel: Türme schießen auf ankommende Gegner. Damit die Gegner Schaden nehmen können haben sie eine Health Componente.

Problem:
Wenn nun z.B. eine Rakete, die Flächenschaden verursacht, aufschlägt muss ich alle im Aufschlagbereich befindlichen Gegner beschädigen. Die Health Componente der Gegner hat eine Public Methode zum Schaden nehmen.
Wenn jetzt 30 Gegner betroffen wären, müsste ich ja in einem Frame 30x getComponent<HealthController> aufrufen damit ich die Public Methode zum Schaden nehmen aufrufen kann,
was mir irgendwie nicht gut gelöst zu sein scheint. Ein Test zeigt, dass das Spiel sogar für einen kurzen Moment hängt (nur im Editor getestet).

Idee:
Sämtliche Gegner wollte ich schon zu Spielstart laden und in einem Dictionary verwalten. Zum Beispiel als Key die (int)InstanceID des Gegner GameObjects und als Value den HealthController oder ein Struct aus GameObject und HealthController:

C#-Quelltext

1
Dictionary<int, HealthController> enemyPool;


Dann müsste ich zu Spielstart vielleicht 1000x getComponent aufrufen, aber später im Spiel könnte dann die eingeschlagene Rakete die InstanceIDs der getroffenen Gegner abfragen und über das Dictionary die HealthController ansprechen.

Weiterführende Frage dazu:
Das andere ist, dass jeder Turm einen eigenen GegnerPool haben soll, der nur Gegner in Reichweite enthält. Über einen Collider am TurmObjekt würde ich über die OnTriggerEnter bzw Exit Funktion die Gegner in den Pool aufnehmen/rauswerfen.
Dazu würde ich wieder die InstanceIDs der Gegner in Reichweite abfragen und mit dieser auf die HealthController aus dem allgmeinen GegnerPool zuzugreifen.


Ist das so sinnvoll? Gibt es bessere Wege?
Es führen ja viele Wege nach Rom, aber ich möchte ungerne den holprigsten nehmen.

EDIT: Ich führe mir das hier zu Gemüte, vielleicht kriege ich da schon meine Antwort: http://www.theappguruz.com/blog/make-you…aries-in-detail

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Tris« (02.07.2020, 01:53)


David Scherfgen

Administrator

Beiträge: 10 278

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

03.07.2020, 10:19

30x GetComponent<> in einem Frame aufzurufen sollte überhaupt kein Problem sein. Wenn das Spiel wirklich hängt, dann bestimmt aus einem anderen Grund. Hast du mal die Performance-Messung von Unity bemüht? Die zeigt dir an, in welchem Teil deines Codes (und der Unity Engine) wie viel Zeit verbraten wird, auch für individuelle Frames. (Kann allerdings sein, dass es das nur in der Pro-Version gibt, bin mir gerade nicht sicher.)