Как получить любой компонент скрипта из игрового объекта - PullRequest
0 голосов
/ 11 февраля 2020

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

Я понимаю, что могу сделать что-то вроде этого:

if(Target.getComponent<Enemy1script>()) Target.getComponent<Enemy1Script>().health -= Damage

Однако у меня есть В моей игре много разных типов врагов и, следовательно, множество разных сценариев, то есть это не так эффективно. Поскольку все эти сценарии имеют одну общую переменную (health), мне интересно, можете ли вы просто получить доступ к их компоненту сценария в целом?

Например:

Target.getComponent<Script>().health -= 1

1 Ответ

1 голос
/ 11 февраля 2020

Решение

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

Например:

Enemy.cs

public class Enemy : Monobehaviour {
    public int health;
};

EnemyType1.cs

public class EnemyType1 : Enemy {
    //Unique enemy behaviour goes here
};

Это означает, что вы можете использовать

target.GetComponent<Enemy>().health;

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

Рекомендация

Вызов GetComponent очень ресурсоемкий, так что я лично сделал бы это

target.SendMessage("applyDamage", damageToDo, SendMessageOptions.DontRequireReceiver);

, и тогда в вашем вражеском классе вы получите

public class Enemy : Monobehaviour {
    private int health;

    public void applyDamage(int amount) {
        health-=amount;
    }
};

Документы единства хорошо объясните, что такое SendMessage и как его использовать. Таким образом, он пытается вызвать эту функцию в любом скрипте, связанном с объектом, и передаст ему аргумент. Если вам нужно отправить несколько аргументов, вам придется создать структуру и отправить ее вместо этого. Последний аргумент в SendMessage означает, что если он столкнется с чем-то, у кого нет функции, это не заставит игру выдать исключение, и cra sh

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