Уничтожение врагов прыжком, как в «Марио» Unity 2D

Здравствуйте! В этой статье хотел бы поделиться как реализовать, уничтожение врагов прыжком, как в Марио. Сам, еще учусь, так что если буду какие-нибудь полезные советы или подсказки пишите в комментарии обязательно прочту. Ну что же, после многочисленных просмотров туториалов, и прочитанных статей было найдено всего два интересных, и наверное проще всего в исполнение вариантов:

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

Для начала напишем функцию которая будет отнимать жизнь у игрока, и необходима для обоих вариантов:

public int health = 3; 
void Hurt()
    {
        health--;
        if (health <= 0)
            SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
    }

1 вариант


Разберем первый вариант если точка соприкосновения будет больше или ровна высоте 0.6, игрок прыгает сверху враг уничтожается, иначе игрок получает урон.

void OnCollisionEnter2D(Collision2D collision)
    {
        Enemy enemy = collision.collider.GetComponent<Enemy>();
        if (enemy != null)
        {
            foreach (ContactPoint2D point in collision.contacts)
            {
                if (point.normal.y >= 0.6f)
                {
                    enemy.EnemyHurt();
                }
                else
                {
                    Hurt();
                }
            }
        }

(Фрагмент кода который вешается на игрока)

public void EnemyHurt()
    {
        Destroy(this.gameObject);
    }

(Фрагмент кода который вешается на врага )

2 вариант


Добавляем коллайдер делаем его чуть выше чем основной коллайдер, ставим галочку “is Trigger” на объект вешаем скрипт, и добавляем вот этот фрагмент кода.

private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.name == "Player")
            Destroy(this.gameObject);
    }

(Фрагмент кода который вешается на врага )

Когда коллайдер соприкоснется с объектом под названием “Player” объект уничтожиться (в качестве метки соприкосновения, можно использовать tag).

Дальше в этом же объекте создаем еще один gameObject называем его DeathZone. Добавляем на него коллайдер, делаем его чуть больше, и ставим галочку “is Trigger”.



  private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.name == "DeathZone")
        {
            Hurt();
        }
    }

(Фрагмент кода который вешается на игрока)

Как видно в отличие от первого варианта, во втором варианте использование коллайдеров было чуть больше, а также отсутствовала необходимость использовать триггеры.


(Второй вариант)

Так же можно еще добавить, чтобы игрок отпрыгивал после уничтожения врага. Ну что же вроде бы все, всем спасибо за внимание!

Комментарии 5

    0
    рекомендую почитать про physics 2d effectors, у юнитеков есть уроки на эту тему, и там в частности, есть возможность сделать коллайдер односторонним, то есть он будет регистрировать коллизии только сверху
      –2
      Умрёт Марио сам или убьёт врага зависит не от точки касания, а от вертикальной составляющей скорости. При движении вниз — убивает.
        +1
        то есть пролетая вниз мимо монстра на платформе, случайно задевая рожу моба боком, он его убьет?
          0
          Ну, падающий кирпич, случайно задевающий голову рабочего без каски на стройке ответил бы на ваш вопрос утвердительно. Вопрос ещё и в точке касания. В стопу вряд-ли, а вот в голову может.
          Но в Марио, вроде, засчитывается только падение на моба сверху
            0
            Убьёт если коснётся хитбоксом.
            В этом видео рассказывают о многих механиках. Отмотайте на 2:24 и дальше примерно минута.

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое