Hallo zusammen,
ich habe mal wieder eine Frage bezüglich einer Überlegung zu folgender Situation/Problem
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