不能同时伤害多个敌人

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