敌人生命和子弹力量统一3d c#

本文关键字:3d 力量 生命 子弹 敌人 | 更新日期: 2023-09-27 18:36:47

我是Unity的新手。我已经成功地使玩家可以向敌人发射子弹取决于当前波,而我使敌人拥有的地方是自己的生命取决于当前波乘以一定的价值。如果敌人生命值为0,则敌人死亡。但是,问题是:例如,场景中有 2 个敌人,敌人生命值为 5,玩家开始射击第一个敌人,直到敌人生命值减少到 2,当玩家开始射击第二个敌人时,敌人的生命不再是 5,而是 2,直到 2 个立方体中的一个死亡并且敌人生命重置为 5。

如何解决这个问题?

这是项目符号脚本:

public class BulletManager : MonoBehaviour 
{
private ScoreManager scoreManager;
private PlayerController playerController;
private EnemyManager enemyManager;
public int bulletPower;
private void Start()
{
    scoreManager = GameObject.Find("Game Manager").GetComponent<ScoreManager>();
    playerController = GameObject.Find("Character").GetComponent<PlayerController>();
    enemyManager = GameObject.Find("Game Manager").GetComponent<EnemyManager>();
    bulletPower = playerController.currentWave;
}
private void OnTriggerEnter(Collider col)
{
    if (col.gameObject.tag == "Enemy")
    {
        enemyManager.enemyLife -= bulletPower;
        if (enemyManager.enemyLife <= 0)
        {
            scoreManager.Points += (2 * playerController.currentWave);
            enemyManager.enemyLife = playerController.currentWave * 5;
            Destroy(col.gameObject);
        }
    }
}
}

这是敌人的脚本:

public class EnemyManager : MonoBehaviour 
{
private ScoreManager scoreManager;
private SoundManager soundManager;
private PlayerController playerController;
public int enemyLife;
private void Start()
{
    scoreManager = GameObject.Find("Game Manager").GetComponent<ScoreManager>();
    soundManager = GameObject.Find("Game Manager").GetComponent<SoundManager>();
    playerController = GameObject.Find("Character").GetComponent<PlayerController>();
    enemyLife = playerController.currentWave * 5;
}
private void Update()
{
    if (playerController.life <= 0)
    {
        Invoke("Restart", 1);
    }
}
private void OnTriggerEnter(Collider col)
{
    if (col.gameObject.tag == "Bullet")
    {
        soundManager.PlaySound("Enemy Dead");
        Destroy(col.gameObject);
    }
    else if (col.gameObject.tag == "Destroyer")
    {
        playerController.life--;
    }
}
private void Restart()
{
    scoreManager.SendToHighScore();
    Application.LoadLevel(0);
}
}

敌人生命和子弹力量统一3d c#

问题是你所有的敌人都使用敌人经理类来管理他们的生命值。你的代码所做的是计算所有敌人的命中量,然后摧毁最后一个被击中的敌人。我的建议是添加一个 EnemyStats 类来管理特定于每个敌人的属性(敌人的名称、他们可以造成的伤害量、武器图形、音效、天空极限)。我不想马上给你答案(或者至少是一个基本的答案),因为这是一个很好的学习机会,但这里有一个基本的脚本,应该做你需要的,你需要对你的BulletManager脚本所做的更改。

敌人统计.cs(附加到敌人游戏对象)

public class EnemyStats : MonoBehaviour
{
    public int currentHealth;
    public int maxHealth;
    public float increasePerWave;
    public int bulletPower;
    // use a negative value for healing
    public void ReduceHealth(int damage)
    {
        currentHealth -= damage;
    }
    public bool IsDead()
    {
        return currentHealth <= 0;
    }
    public int GetDamage()
    {
        return bulletPower;
    }
    /// Restores enemy to their max health for the current wave. Call this after creating an spawning.
    public void RestoreHealth(int wave)
    {
        currentHealth = (int)(maxHealth * increasePerWave * (wave + 1));
    }
}

项目符号管理器更新

private void OnTriggerEnter(Collider col)
{
    if (col.gameObject.tag == "Enemy")
    {
        EnemyStats stats = col.GetComponent<EnemyStats>();
        if (stats)
        {
            stats.ReduceHealth(bulletPower);
            if (stats.IsDead())
            {
                scoreManager.Points += (2 * playerController.currentWave);
                Destroy(col.gameObject);
            }
        }
    }
}