【问题标题】:Unity 2D same state for different enemies issueUnity 2D 不同敌人的相同状态问题
【发布时间】:2018-10-20 23:47:19
【问题描述】:

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

问题如下:

->用剑击中敌人 1,

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

【问题讨论】:

    标签: unity3d


    【解决方案1】:

    追踪敌人状态敌人内部

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

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

    您的播放器脚本不需要知道(也不关心!)这些信息,任何试图在这里处理它的尝试都是愚蠢的。一旦你改变了敌人的数量,或者创建了一种新的敌人类型,你就会得到一堆你无法管理的无用垃圾。

    【讨论】:

    • 谢谢,好的做法通常是好的 - 所以我确实像你说的那样删除了链接这两个脚本的所有内容。我通过检查敌人是否失去健康来管理它,如果是,那么状态是活跃的。老实说,现在它的工作更自然了。谢谢 - 再次:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多