【问题标题】:Enemy life and bullet power unity3d c#敌人生命和子弹力量 unity3d c#
【发布时间】:2015-01-09 05:38:38
【问题描述】:

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

【问题讨论】:

  • 是否每个敌人都附加了自己的脚本,或者敌人管理器脚本是否附加在其他东西上?我要做的是在敌人身上附加一个脚本来保存变量的剩余生命。
  • 每个敌人只附加了一个 EnemyManager 脚本,并且在名为 GameManager 的空对象中。那么,您的建议是创建一个脚本来保存敌人的生命并将其附加到敌人身上?
  • 你应该给每个敌人一个脚本来管理它的生命值和所有与生命值相关的东西,比如死亡。健康管理不应该是 GameManager 的一部分,因为名为“GameManager”的类应该只管理游戏部分,如得分、重置、保存、加载等。此外,GameObject.Find() 是一个非常慢的操作,应该是尽可能避免。

标签: c# unity3d


【解决方案1】:

问题是你所有的敌人都使用 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);
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多