敌人生命和子弹力量unity3d c#

时间:2015-01-09 05:38:38

标签: c# unity3d

我是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);
}
}

1 个答案:

答案 0 :(得分:0)

问题在于您所有的敌人都使用EnemyManager类来管理其健康状况。您的代码要做的是计算所有敌人的命中次数,然后销毁最后一个命中的敌人。我的建议是添加一个EnemyStats类来管理特定于每个敌人的统计信息(敌人的名称,他们可以造成的伤害程度,武器图形,音效,天空的极限)。我不愿立即给您答案(或者至少是一个基本的答案),因为这是一个很好的学习机会,但是这里有一个基本的脚本,它可以满足您的需求以及您对BulletManager脚本所做的更改。

EnemyStats.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));
    }
}

BulletManager 更新

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);
            }
        }
    }
}