统一:敌人刷出/生命系统
本文关键字:生命 系统 敌人 统一 | 更新日期: 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应该是一个单例对象,只有一个责任"管理敌人刷出"与maximunEnemyCount
和currentEnemyCount
。当你的currentEnemyCount < maximunEnemyCount
时,你总是可以刷出。
OnTakeDamage()
和OnDeath()
应该是你的敌人行为的接口(在一个独立的脚本从SpawnManager,让我们假设EnemyBehaviour脚本),你的破坏应该只针对自己的实例Destroy(this.gameObject)
记住当敌人死亡时通知你的SpawnManager在你的OnDeath方法上调整enemyCurrentCount。
我认为这是一种更优雅的方式来完成这项任务,并且在管理敌人实例时不易受到bug的影响。
编辑:我在
之前忘记的链接单例引用你需要一个独特的游戏对象来管理,它应该知道有多少敌人可以存活,有多少人存活,而不是更多关于敌人的信息(敌人的生命值是敌人对象的责任)。
每个敌人都需要知道自己何时死亡,并通知管理员减少其计数器