我在敌人的产卵系统工作。这是我的代码:
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条鲨鱼作为敌人。问题是当我损坏一个时,即使我向第一个鲨鱼射击,也只有最后创建的实例被破坏。此外,其他实例和新产卵实例的健康状况根本没有受到影响。
我很感激任何建议,我花了很多时间使用这段代码,似乎我需要一些关于实例的帮助 - 健康逻辑。
非常感谢
答案 0 :(得分:3)
拆分您的spawn管理器行为和您的敌人行为,并使用interfaces以更加SOLID的方式组织您的代码。转动你的对象只负责一个范围(现在你的SpawnManager负责敌人的行为/责任)
SpawnManager应该是singleton对象,只有一个责任&#34;来管理敌人的产卵&#34;使用maximunEnemyCount
和currentEnemyCount
。您可以在currentEnemyCount < maximunEnemyCount
。
OnTakeDamage()
和OnDeath()
应该是你的敌人行为的界面(在与SpawnManager分开的脚本中,让我们假设EnemyBehaviour脚本)并且你的destroy应该只针对它自己的实例Destroy(this.gameObject)
< / p>
当Ondath方法中的敌人死亡以调整enemyCurrentCount时,请记住通知您的SpawnManager。
我认为这是一种更优雅的方式来完成这项任务,并且不易受到管理敌人实例的错误的影响。
<强>编辑:强> 我之前忘记的链接单例引用
你需要一个独特的游戏对象来管理,应该知道有多少敌人可以生存,有多少人生活,没有更多关于敌人(在这种情况下敌人的健康是敌人的责任)
每个敌人都需要知道他/她何时去世,因此通知经理减少其计数器。