统一:敌人刷出/生命系统

本文关键字:生命 系统 敌人 统一 | 更新日期: 2023-09-27 18:05:19

我正在研究一个敌人刷出系统。这是我的代码:

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个鲨鱼作为敌人。问题是,当我破坏了一条鲨鱼,只有最后一个创建的实例被破坏,即使我射击了第一条鲨鱼。另外,其他实例和新生成实例的生命值完全不受影响。

我很感激任何建议,我花了很长时间在这个代码上,似乎我需要一些关于实例的帮助-健康逻辑。

非常感谢

统一:敌人刷出/生命系统

分离你的刷出管理器行为和你的敌人行为,并使用接口以更可靠的方式组织你的代码。把你的对象只负责一个范围(现在你的SpawnManager目前负责敌人的行为/责任)

SpawnManager应该是一个单例对象,只有一个责任"管理敌人刷出"与maximunEnemyCountcurrentEnemyCount。当你的currentEnemyCount < maximunEnemyCount时,你总是可以刷出。

OnTakeDamage()OnDeath()应该是你的敌人行为的接口(在一个独立的脚本从SpawnManager,让我们假设EnemyBehaviour脚本),你的破坏应该只针对自己的实例Destroy(this.gameObject)

记住当敌人死亡时通知你的SpawnManager在你的OnDeath方法上调整enemyCurrentCount。

我认为这是一种更优雅的方式来完成这项任务,并且在管理敌人实例时不易受到bug的影响。

编辑:我在

之前忘记的链接单例引用

你需要一个独特的游戏对象来管理,它应该知道有多少敌人可以存活,有多少人存活,而不是更多关于敌人的信息(敌人的生命值是敌人对象的责任)。

每个敌人都需要知道自己何时死亡,并通知管理员减少其计数器