Мучаюсь с юнити, есть ли эксперты по С#?!
Можно ли как-то сделать динамические изменяемые скрипты AI и Animator?
Допустим я хочу сделать, чтобы можно легко менять у персонажей AI скрипты,
и эти скрипты называются по разному CowAI, DogAI, HumanAI
Можно ли сделать как-то аналог такого псевдокода?AI CurrentAI = GetComponent<Один из моих скриптов AI>();
- 25 октября 2021, 10:10
- 03
Не совсем понял цели твоей задачи, но в Unity можно без проблем добавлять/удалять компоненты из кода. см. AddComponent/RemoveComponent
Тогда всё упрощается и не надо городить классы. Возможно, тут задействована магия: зачаровал овцу, теперь она "думает", как корова. =)
Ну допустим я хочу в Орка добавить компонент OrcAI, а в Змею добавить компонент SnakeAI.
Как потом заставить главный скрипт Character, понимать какой скрипт привязан у меня?
В GMS и Lua нет проблем, я просто к переменной могу привязать любую функцию:
MyCurrentAI = MyFunctionAI();
А потом вызывая эту переменную, я мог бы вызывать функцию текущего ИИ, всё просто.
А в C# нельзя так сделать. Отсюда и начались поиски костылей.
Ещё я нарыл идею про интерфейсы в C#, и вроде выглядит прикольно, но ещё не проверял:
То есть непонятно как нанести урон Аватару из этого примера на C# юнити?!
Возможно так или нет?
if (myAvatar.GetComponent<IDamageable>()) myAvatar.Damage(5);
А может я не прав и оно не так работает... Пойду ещё гуглить...
Смотря что ты хочешь с этим делать дальше. Неужели ты хочешь из Character взять свой AI и узнать что это вот прям точно OrcAI ?
Если тебе в Character нужно просто контролировать AI (функция "думать", например), то как тут уже писали - это наследование от одного супер-базового класса с функцией "думать". Либо можно использовать интерфейс. Только в главном AI классе "думать" должна быть virutal, чтобы в OrcAI ты мог её override.
То есть другими словами, я хотел бы получить универсальный доступ к компоненту из другого скрипта:
А вот так в юнити не работает.
Если ты хочешь получить список всех компонентов, то через Гугл выдаёт такое решение: https://answers.unity.com/questions/935586/how-to-get-all-components-in-scene-which-inherit-a.html
Работа через интерфейсы это как с наследованием, только тут ты проверяешь текущий класс, содержит реализацию данного интерфейса, если да, то выполняешь его метод: https://metanit.com/sharp/tutorial/3.49.php
Присвоение функции переменной в C# возможно: https://metanit.com/sharp/tutorial/2.21.php
Ну ещё анонимные методы: https://metanit.com/sharp/tutorial/3.15.php
Большое Спасибо! Хотелось бы только заранее знать какой метод лучше и где меньше всего подводных камней и потенциальных проблем, но возможно пока попробую интерфейсы, а с иеархией классов пока путаюсь.
А кто бы этого не хотел =)
Всё упирается не только в задачу, но и в архитектуру всего проекта, требований к функционалу и расширяемости. Опыт только поможет. Пока не набьёшь шишек, знать не будешь. Если работать в команде, то у кого больше опыта, то им делится и объясняет что к чему, но он видит всю проблему.