Unity gameObject без скрипта достигает метода столкновения - PullRequest
0 голосов
/ 21 апреля 2020

Итак, я беру урок по основам c разработки игр и сейчас работаю над игрой с Unity. Моя игра прекрасно работала до тех пор, пока я не обновил свою версию Unity. Для того, чтобы игрок действительно получил урон, у меня есть метод, который может быть достигнут только при явном вызове скриптом. Каким-то образом земля, на которой нет сценария, повреждает моего игрока.

Я разместил код ниже.

Это часть скрипта игрока

3 references
public void Hurt(int dmg, string yep)
    {
        HP -= dmg;
        Debug.Log($"took {dmg} damage from{yep}. You now have {HP} HP left");
        if (HP <= 0)
        {
            SceneManagement.Death();
        }
    }

Эта часть скрипта привязана к моему объекту пламени

private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.tag != "FlameTurret" && collision.gameObject.tag != "flame")
        {
            player.GetComponent<PlayerController>().Hurt(damage, collision.gameObject.tag);
             Destroy(this.gameObject);
        } 
    }

Этот прикреплен к снаряду, выпущенному противником

if (collision.gameObject.CompareTag("Player"))
        {
            if (!called)
            {
                collision.gameObject.GetComponent<PlayerController>().Hurt(damage, collision.gameObject.tag);
                called = true;
            }
        }

Этот прикреплен к врагу

if (collision.gameObject.CompareTag("Player"))
        {
            if (!called)
            {
                collision.gameObject.GetComponent<PlayerController>().Hurt(damage, collision.gameObject.tag);    
                called = true;
            }
            Destroy(this.gameObject);
        }

Вывод на консоль

Ничто с тэгом "Ground" не имеет скрипта, и ничто иное, как методы, которые я выложил, не должно ссылаться на мой метод Hurt (), но земля все равно повреждает моего игрока. Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 21 апреля 2020

Ваша проблема в том, что эта функция здесь

private void OnCollisionEnter2D(Collision2D collision)

будет запускаться всякий раз, когда любой коллайдер (игровой объект с прикрепленным компонентом коллайдера - игровому объекту не нужно иметь любые скрипты, прикрепленные к нему) пересекаются с вашим игроком

Этот код здесь

 if (collision.gameObject.tag != "FlameTurret" && collision.gameObject.tag != "flame")

Будет проходить, пока объект, который сталкивается, не имеет тег "FlameTurret" или "flame", что, как я полагаю, не соответствует вашей позиции.
Мне кажется немного странным, что все в вашей игре повредит вашему игроку за исключением для пламени ... это ошибка? ?
В любом случае, простым решением было бы пометить вашу землю чем-то вроде environment, а затем добавить под вашим OnCollisionEnter2D() галочку в соответствии с

 if (collision.gameObject.tag == "environment"){
    return; // do nothing
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...