Unity 2D相同状态针对不同敌人的问题

时间:2018-10-20 12:34:10

标签: unity3d

我正在制作2D平台游戏,并且遇到了奇怪的错误-当我击中一个敌人时,该类型的其他每个敌人都处于相同的状态。我的意思是当我的玩家用剑击中其中一个时,我希望他们进入“愤怒”状态。

问题看起来像这样:

->用剑击中敌人

-> Enemy1受到伤害并进入“愤怒”状态,

-> Enemy2 / 3/4/5没有受到伤害,但是进入了“愤怒”状态。

如果每个人都受到伤害,那我为什么要遭受这种情况。我认为原因在我的损害脚本中。如果有人有想法,我会很高兴听到。预先感谢。

public void DealDmg()
{
    blob = FindObjectOfType<EnemyScript>();

    if (attackPos.gameObject.activeSelf == true)
    {

        Collider2D[] enemiesToDamage = Physics2D.OverlapCircleAll(attackPos.position, attackRange, whatIsEnemy);

        for (int i = 0; i < enemiesToDamage.Length; i++)
        {
            EnemyScript enemyScript = enemiesToDamage[i].GetComponent<EnemyScript>();

            enemyScript.GetComponent<EnemyScript>().TakeDmg(damage);

            if (gameObject.GetComponent<PlayerControls>().facingRight == true)
            {
                enemyScript.GetComponent<Rigidbody2D>().AddForce(new Vector2(30f, 20f), ForceMode2D.Impulse);

                StartCoroutine("ResetValues");

                blob.CalmLogic();

            }
            else if (gameObject.GetComponent<PlayerControls>().facingRight == false)
            {
                enemyScript.GetComponent<Rigidbody2D>().AddForce(new Vector2(-30f, 20f), ForceMode2D.Impulse);

                StartCoroutine("ResetValues");

                blob.CalmLogic();

            }
        }
        attackPos.gameObject.SetActive(false);
    }
}
    public IEnumerator ResetValues()
{
    gotHit = true;
    blob.gotAngry = true;
    yield return new WaitForSeconds(resetValuesDelay);
    gotHit = false;
    yield return new WaitForSeconds(resetValuesDelay);
    blob.gotAngry = false;
}

1 个答案:

答案 0 :(得分:1)

跟踪敌人内部的敌人状态

现在看来您的代码正在播放器上运行,而 player 正在跟踪敌人的状态。错了您的播放器脚本永远不应该了解敌人的属性(更不用说修改了!)。玩家应该做的是:

  • 当玩家成功击中敌人时,玩家会告诉敌人“您已被击中!”
  • 然后,敌方脚本会获取该信息(例如,造成了多大的伤害,其造成的伤害类型等)并自行处理:减少伤害(“我穿着盔甲吗?”),增强伤害(“我穿着盔甲”)如此之弱……诸如此类,例如,对玩家生气以及由此产生的冷却时间在再次平静之前。

您的播放器脚本不需要了解(也不关心!)此信息,并且在此处尝试处理该信息的任何尝试都是愚蠢的。一旦您更改了敌人的数量,或创建了一种新的敌人类型,它会做其他事情,最终会导致一大堆您无法管理的无用垃圾。