我正在制作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;
}
答案 0 :(得分:1)
现在看来您的代码正在播放器上运行,而 player 正在跟踪敌人的状态。错了您的播放器脚本永远不应该了解敌人的属性(更不用说修改了!)。玩家应该做的是:
您的播放器脚本不需要了解(也不关心!)此信息,并且在此处尝试处理该信息的任何尝试都是愚蠢的。一旦您更改了敌人的数量,或创建了一种新的敌人类型,它会做其他事情,最终会导致一大堆您无法管理的无用垃圾。