Unity:Enemy Spawn / 健康系统

Unity: Enemy Spawn / Health System

我在敌人重生系统工作。这是我的代码:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;


public class EnemyManager : MonoBehaviour
{
 public GameObject shark;                // prefab von Shark
 public GameObject instanceShark;        // globale Instanzvariable von Shark
 public Transform[] spawnPoints;         // An array of the spawn points this enemy can spawn from.
 public float spawnTime = 3f;            // How long between each spawn.
 public int maximumSharks = 2;
 private int currentSharks;
 public int healthShark; // current Health von Shark
 public int startinghealthShark = 200;
 public float sinkSpeed = 2.5f;
 bool isDead;

 void Start ()
 {
     healthShark = startinghealthShark;
     currentSharks = 0;
 }


     void Update ()
 {
     if (currentSharks <= maximumSharks) {
         InvokeRepeating ("Spawn", spawnTime, spawnTime);
     }
     Debug.Log (currentSharks);    
 }


 void Spawn ()
 {    
     // Find a random index between zero and one less than the number of spawn points.
     int spawnPointIndex = Random.Range (0, spawnPoints.Length);

     // Create an instance of the enemy prefab at the randomly selected spawn point's position and rotation.
     instanceShark = Instantiate (shark, spawnPoints[spawnPointIndex].position, spawnPoints[spawnPointIndex].rotation) as GameObject;

     currentSharks++;
     if (currentSharks >= maximumSharks) {
         CancelInvoke("Spawn");
     }
 }

 public void AddDamageToShark (int neuDamageWert) // Addiere zu damage. Public function, können andre scripts auch aufrufen
 {
     // If the enemy is dead...
     if(isDead)
         // ... no need to take damage so exit the function.
         return;

     healthShark -= neuDamageWert;

     if (healthShark <= 0) {  //tot
         Death ();
     }
     Debug.Log (healthShark);
 }

 void Death ()
 {

     // The enemy is dead.
     isDead = true;
     currentSharks--;
     Destroy (instanceShark);
     Debug.Log ("dead?");    
     return;
 }

我想要的:只要未达到最大数量就生成敌人(这部分目前有效)并摧毁已被击中的敌人并重生另一个敌人(不起作用)。

这段代码目前创建了 2 条鲨鱼作为敌人。问题是当我损坏一个时,即使我射中了第一条鲨鱼,也只有最后创建的实例被销毁。其他实例和新生成实例的健康状况也完全不受影响。

如果有任何建议,我将不胜感激,我在这段代码上花费了很长时间,看来我需要一些有关实例 - 健康逻辑的帮助。

非常感谢

分离生成管理器行为和敌人行为,并使用 interfaces 以更可靠的方式组织代码。让你的对象只负责一个范围(现在你的 SpawnManager 当前负责 Enemy behaviours/responsabilities)

SpawnManager 应该是一个 singleton 对象,只有一个职责 "to manage enemy spawn",具有 maximunEnemyCountcurrentEnemyCount。当你的 currentEnemyCount < maximunEnemyCount.

时,你总是可以产卵

OnTakeDamage()OnDeath() 应该是你的敌人行为的接口(在与 SpawnManager 分开的脚本中,让我们假设 EnemyBehaviour 脚本)并且你的销毁应该只针对它自己的实例 Destroy(this.gameObject)

记得在敌人死亡时通知您的 SpawnManager 在您的 OnDeath 方法中调整 enemyCurrentCount。

我认为这是完成此任务的一种更优雅的方式,并且在管理敌人实例时更不容易出现错误。

已编辑: 我之前忘记的链接单例引用

你需要一个独特的游戏对象作为管理器,它应该知道有多少敌人可以存活以及有多少存活,仅此而已(在这种情况下,敌人的健康是敌人对象的责任)。

每个敌人都需要知道 he/she 何时死亡,因此通知管理器减少其计数器。