不能同时伤害多个敌人
cannot damage multiple enemies in unity
这是我的代码片段:
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 没有。
这是我的 EnemyStuff TakeDamage void:
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));
}
}
}
这是我的 Enemyhe take damage void:
public void TakeDamage(int damage)
{
当前健康 -= 伤害;
// 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
将导致执行方法在执行时 "stop"。如果方法 returns 一个对象,则该对象必须使用关键字返回。
continue
将导致包含循环的下一次迭代为 运行.
break
将退出包含循环。
我通过用以下代码替换上面的代码行来修复它:
` private void Cross()
{
animator.SetTrigger("交叉");
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);
}
`
这是我的代码片段:
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 没有。 这是我的 EnemyStuff TakeDamage void:
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));
}
}
}
这是我的 Enemyhe take damage void: public void TakeDamage(int damage) { 当前健康 -= 伤害;
// 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
将导致执行方法在执行时 "stop"。如果方法 returns 一个对象,则该对象必须使用关键字返回。
continue
将导致包含循环的下一次迭代为 运行.
break
将退出包含循环。
我通过用以下代码替换上面的代码行来修复它:
` private void Cross() { animator.SetTrigger("交叉"); 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);
}
`