这是我的代码片段:
private void Cross()
{
animator.SetTrigger("cross");
Collider2D[] hitEnemies = Physics2D.OverlapCircleAll(attackPoint.position, Firerange2, enemyLayers);
foreach (Collider2D enemy in hitEnemies)
{
enemy.GetComponent<Enemyhealth>().TakeDamage(crossdamage);
if (enemy == null)
{
return;
}
enemy.GetComponent<EnemyStuff>().TakeDamage(crossdamage);
if (enemy == null)
{
return;
}
}
}
在该代码中,Enemyhealth 脚本会损坏,但 EnemyStuff 不会损坏。如果我像这样重新排列它:
private void Cross()
{
animator.SetTrigger("cross");
Collider2D[] hitEnemies = Physics2D.OverlapCircleAll(attackPoint.position, Firerange2, enemyLayers);
foreach (Collider2D enemy in hitEnemies)
{
enemy.GetComponent<EnemyStuff>().TakeDamage(crossdamage);
if (enemy == null)
{
return;
}
enemy.GetComponent<Enemyhealth>().TakeDamage(crossdamage);
if (enemy == null)
{
return;
}
}
}
EnemyStuff脚本被损坏,但EnemyHealth不会。 这是我的敌人物品伤害无效:
public void TakeDamage(int damage)
{
currentHealth -= damage;
// play hurt animaton
if (damage == 10)
{
animator.SetTrigger("jab");
if (LookAtCharacter.facingRight == true)
{
rb.AddForce(new Vector2(-150, 0));
}
else if (LookAtCharacter.facingRight == false)
{
rb.AddForce(new Vector2(150, 0));
}
}
if (damage == 15)
{
animator.SetTrigger("uppercut");
if (LookAtCharacter.facingRight == false)
{
rb.AddForce(new Vector2(200, 130));
}
else if (LookAtCharacter.facingRight == true)
{
rb.AddForce(new Vector2(-200, 130));
}
}
if (damage == 20)
{
animator.SetTrigger("cross");
if (LookAtCharacter.facingRight == false)
{
rb.AddForce(new Vector2(200, 0));
}
else if (LookAtCharacter.facingRight== true)
{
rb.AddForce(new Vector2(-200, 0));
}
}
}
这是我的敌人他受到伤害无效: 公共无效 伤害(int 伤害( { 当前生命值 -= 伤害;
// play hurt animaton
if (damage == 10)
{
animator.SetTrigger("hurt");
if (enemyscript.facingRight == true)
{
rb.AddForce(new Vector2(-150, 0));
}
else if (enemyscript.facingRight == false)
{
rb.AddForce(new Vector2(150, 0));
}
}
if (damage == 15)
{
animator.SetTrigger("hurt");
if (enemyscript.facingRight == false)
{
rb.AddForce(new Vector2(200, 130));
}
else if (enemyscript.facingRight == true)
{
rb.AddForce(new Vector2(-200, 130));
}
}
if (damage == 20)
{
animator.SetTrigger("hurt");
if (enemyscript.facingRight == false)
{
rb.AddForce(new Vector2(200, 0));
}
else if (enemyscript.facingRight == true)
{
rb.AddForce(new Vector2(-200, 0));
}
}
}
我该如何解决这个问题?
看起来您正在按照以下任一行导致enemy
变得null
:
enemy.GetComponent<EnemyStuff>().TakeDamage(crossdamage);
enemy.GetComponent<Enemyhealth>().TakeDamage(crossdamage);
然后,您选择将其作为从方法中return
的条件。
我相信您想改用关键字continue
代替return
,以便在处理hitEnemies
中的下一个enemy
。
我不确定这是否是您自己的实现,但是让这些方法使enemy
对象无效似乎不是一个好主意,因为在这种情况下,您只能调用TakeDamage
方法之一。
供您参考:
return
将导致执行方法在执行时"停止"。如果该方法返回一个对象,则必须使用关键字返回该对象。
continue
将导致运行包含循环的下一次迭代。
break
将退出包含循环。
我通过将上面的代码行替换为以下内容来修复它:
' 私人无效 交叉(( { 动画 师。设置触发器("交叉"(; Collider2D[] hitEnemies = Physics2D.OverlapCircleAll(attackPoint.position, Firerange2, enemyLayers(;
foreach (Collider2D enemy in hitEnemies)
{
if (enemy.CompareTag("enemy"))
{
enemy.GetComponent<Enemyhealth>().TakeDamage(crossdamage);
}
else
{
enemy.GetComponent<EnemyStuff>().TakeDamage(crossdamage);
}
`