не может нанести урон нескольким врагам одновременно - PullRequest
0 голосов
/ 20 июня 2020

Вот фрагмент моего кода:

 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 будет поврежден, а «ownHealth» - нет. Это мой 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));
           
        }


        
        
    }

    
}

 

this is my Enemyhe take damage void: publi c void TakeDamage (int damage) {currentHealth - = 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));

        }
    }
}

Как мне исправить это?

Ответы [ 2 ]

3 голосов
/ 20 июня 2020

Похоже, вы превращаете enemy в null после одной из следующих строк:

enemy.GetComponent<EnemyStuff>().TakeDamage(crossdamage);
enemy.GetComponent<Enemyhealth>().TakeDamage(crossdamage);

Что вы затем выбрали в качестве условия для return из вашего метода.

Я полагаю, вы хотите вместо этого использовать ключевое слово continue вместо return, чтобы обрабатывать следующий enemy в hitEnemies.

Я не конечно, если это ваша собственная реализация, но обнуление этими методами объекта enemy не кажется хорошей идеей, поскольку в этом случае вы сможете вызвать только один из ваших методов TakeDamage.

Для справки:

return заставит выполняющийся метод «остановиться» при его выполнении. В случае, если метод возвращает объект, этот объект должен быть возвращен с ключевым словом.

continue вызовет выполнение следующей итерации содержащего l oop.

break выйдет из содержащего l oop.

0 голосов
/ 22 июня 2020

Я исправил это, заменив строку кода выше на это:

`private void Cross () {animator.SetTrigger (" cross "); Collider2D [] hitEnemies = Physics2D.OverlapCircleAll (attackPoint.position, Firerange2, вражеские слои);

    foreach (Collider2D enemy in hitEnemies)
    {

        if (enemy.CompareTag("enemy"))
        {
            enemy.GetComponent<Enemyhealth>().TakeDamage(crossdamage);
        }
        else
        { 
            enemy.GetComponent<EnemyStuff>().TakeDamage(crossdamage);
        }
        `
...