Как правильно обращаться к скрипту в Юнити, который имеет разное название в каждой сцене (GameController (1...10))?
Всем привет!
Ситуация следующая: есть где-то 20 скриптов, из них 19 одинаковы для
всех сцен (движение персонажа, скрипт джойстика, вывод здоровья). Все
основные изменения в лвл-ле (расположение, тип врагов, кол-во врагов,
тип завершения миссии) я объединил в скрипт GameController, который я
собирался переписывать (или сделать абстрактный класс и наследовать) под
каждый лвл.
Здесь и возникла проблема, а именно то, что многие из скриптов
обращаються к GameController (вызов метода, доступ к переменной)
Для метода это выглядит так:
GameController controller = GameObject.FindGameObjectWithTag (
"GameController»). GetComponent ( "GameController") as GameController;
// Создаем объект класса контроллера
controller.KilledEnemy ();
Для переменной:
if (GameController.enemyWin == enemyCreate)
А теперь сам вопрос: можно ли например на 3 лвл-ле брать напрмер ссылку для GameControllerLVL3
Сам я думал создать некую переменную в каждом из скриптов и просто в
редакторе юните перебросить скрипт, или объект, на котором есть данный
скрипт, и как-то получить доступ, но попытки не увенчались успехом
Я мало работал с интерфейсами, можно подробнее рассказать алгоритм?
у меня на каждой сцене есть один и тот же скрипт (например HeroGo), который вызывает метод в GameController (а вот он различную реализацию на каждой сцене, поэтому я хотел создать отдельные скрипты на каждую из них), но проблема в том, что прошлый скрипт напрямую обращается по имени.
И потому я не понял, как с помощью интерфейсов "GetComponent<>() (именно шаблонный)" будет работать на всех сценах.
okamilov Даже не знаю что объяснить... У вас GameController бывает десяти типов. Но методы у них у всех одинаковые. Делаете интерфейс IGameController, выносите в него определения всех публичных методов, которые вам нужны снаружи, а все ваши GameControllerN наследуете от IGameController. Потом в нужном скрипте делаете GetComponent(). Он вам вернет тот GameControllerN, который у вас висит на этом объекте.
GavriKos: Все понятно до стадии заключения нужного GameController, а именно как GetComponent() вернет GameControllerN, так как конструкция GetComponent ( "GameController") не сработает. Разве что по индексу?
И опять же, как я создам переменную, если ее тип - название класа
Или я не так понял и конструкция будет не такая: GameController controller = GameObject.FindGameObjectWithTag (
"GameController»). GetComponent ( "GameController") as GameController; ?
okamilov Применяйте шаблонную функцию. GetComponent(); И вся ваша конструкция станет тогда IGameController controller = GameObject.FindGameObjectWithTag (
"GameController»). GetComponent();
Никакого приведения типов при грамотно написанном интерфейсе не надо.
Ну и подумайте как избавиться от FindGameObjectWithTag - это УЖАСНАЯ функция
GavriKos: я сделал так, как просили, и появилось несколько вопросов.
Указаная конструкция не работает, и есть вопрос, можна ли так описать:
IGameController controller = GameObject.FindGameObjectWithTag("GameController").GetComponent(typeof(IGameController)) as IGameController;
или
IGameController controller = GameObject.FindGameObjectWithTag("GameController").GetComponent();
А так же я не смог понять, как мне заменить конструкцию if (GameController.enemyWin == enemyCreate) (static переменная), так как созданий мной controller от IGameController и не знает о такой переменной. Создавать ф-и для кажого такого обращения?