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",具有 maximunEnemyCount
和 currentEnemyCount
。当你的 currentEnemyCount < maximunEnemyCount
.
时,你总是可以产卵
OnTakeDamage()
和 OnDeath()
应该是你的敌人行为的接口(在与 SpawnManager 分开的脚本中,让我们假设 EnemyBehaviour 脚本)并且你的销毁应该只针对它自己的实例 Destroy(this.gameObject)
记得在敌人死亡时通知您的 SpawnManager 在您的 OnDeath 方法中调整 enemyCurrentCount。
我认为这是完成此任务的一种更优雅的方式,并且在管理敌人实例时更不容易出现错误。
已编辑:
我之前忘记的链接单例引用
你需要一个独特的游戏对象作为管理器,它应该知道有多少敌人可以存活以及有多少存活,仅此而已(在这种情况下,敌人的健康是敌人对象的责任)。
每个敌人都需要知道 he/she 何时死亡,因此通知管理器减少其计数器。
我在敌人重生系统工作。这是我的代码:
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",具有 maximunEnemyCount
和 currentEnemyCount
。当你的 currentEnemyCount < maximunEnemyCount
.
OnTakeDamage()
和 OnDeath()
应该是你的敌人行为的接口(在与 SpawnManager 分开的脚本中,让我们假设 EnemyBehaviour 脚本)并且你的销毁应该只针对它自己的实例 Destroy(this.gameObject)
记得在敌人死亡时通知您的 SpawnManager 在您的 OnDeath 方法中调整 enemyCurrentCount。
我认为这是完成此任务的一种更优雅的方式,并且在管理敌人实例时更不容易出现错误。
已编辑: 我之前忘记的链接单例引用
你需要一个独特的游戏对象作为管理器,它应该知道有多少敌人可以存活以及有多少存活,仅此而已(在这种情况下,敌人的健康是敌人对象的责任)。
每个敌人都需要知道 he/she 何时死亡,因此通知管理器减少其计数器。