Самый эффективный способ получить методы любого объекта коллайдера в Unity? - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть объект-пуля, который обнаруживает врагов с помощью OnTriggerEnter2D().Это работало отлично, пока я не добавил разные типы врагов:

private void OnTriggerEnter2D(Collider2D collision)
    {
        Enemy enemy = collision.GetComponent<Enemy>();
        if (enemy != null)
        {
            enemy.Destroy();
            GameObject effect_ = Instantiate(bulletEffect, transform.position, transform.rotation);
            Destroy(effect_, 0.5f);
            Destroy(gameObject);
        }

    }

Так что просто, если пуля сталкивается с Enemy(), тогда она должна вызвать метод Destroy().

Проблема в том, чтотеперь я добавил в игру несколько врагов, например, есть враг с именем класса Runner() со своим собственным методом смерти.

Я могу добавить условие if и циклически проходить все типы врагов, но это будетстановиться утомительным после добавления новых врагов.

Какой лучший способ сделать это?

Спасибо

Ответы [ 3 ]

0 голосов
/ 17 февраля 2019

Почему бы не позволить противнику решить, что произойдет?

private void OnTriggerEnter2D(Collider2D collision)
{
    Enemy enemy = collision.GetComponent<Enemy>();
    if (enemy != null)
    {
       enemy.DoDeathEffects(); //you will need to create this function.
       Destroy(gameObject);
    }
}

Ваша пуля никогда не должна решать, что делает враг, когда он это делает, это компетенция врага. Поскольку вы хотите, чтобы у ваших различных врагов было разное поведение, это означает, что вам нужно подкласс , класс Enemy и метод DoDeathEffects() должны быть одновременно public и virtual.

0 голосов
/ 18 февраля 2019

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

Альтернативой является создание интерфейса, и заставить ваши компоненты реализовывать этот интерфейс

interface IDeath
{
 void OnDeath();
}

, чем когда происходит коллизия, вы можете сделать GetComponent () и получить ссылку на объекту которого есть этот метод, даже если он не наследует от чего-либо (ну, он должен наследовать MonoBehaviour, но это так)

0 голосов
/ 17 февраля 2019

Создайте скрипт под названием «DamageBehavior».Дайте этому сценарию публичную функцию под названием TakeDamage.Прикрепите этот скрипт к каждому типу врагов, чтобы каждый мог реализовать его по-своему.Затем в вашей функции OnTriggerEnter2D, независимо от типа врага, с которым столкнулись, вызовите его функцию TakeDamage.

private void OnTriggerEnter2D(Collider2D other)
{
   if (other.CompareTag("Enemy"))
    {
        other.GetComponent<DamageBehavior>().TakeDamage();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...