Как проще писать небольшие уникальные скрипты для Unity, не мучая каждый раз себя компиляцией и не создавая сотни уникальных скриптов?
Например мне на уровне нужно при столкновении с кубом изменить переменную, и таких небольших уникальных примеров на многих уровнях наберётся очень много, неужели всегда надо создавать новый класс и писать новые строки, а потом каждый раз ждать компиляцию? Да и для каждого уникального уровня придётся создавать ещё один класс с уникальным названием, что тоже плохо ибо их может наберётся сотни.
PS до этого я делал парсер с вводом разных команд string, но поскольку я заранее не знаю у какого скрипта буду менять переменные и запускать функции, то обычно делал доступ через SendMessage и заранее заготовленную под каждую переменную отдельную функцию, но это очень много кода надо писать на все случаи жизни заранее, в отличии от того же Годот и Game Maker, где доступ к переменным и функциям намного легче, если я знаю что существует объект, то я уже могу получить переменную типа object.HP, даже не зная какой скрипт привязан к этому объекту, что очень удобно. Да и Годот вполне предназначен для написания уникальных микроскриптов, также как и Game Maker (хоть десятки новых скриптов делай на каждый уровень), а в юнити писать микро скрипты для каждого уровня и уникального интерактива кажется зашкваром. Или так многие делают?!
Сообщение отредактировал alexsilent - Четверг, 11 Июня 2020, 15:27
Не совсем понял что ты имеешь в виду с "микро скриптами", ты можешь написать класс и переиспользовать его везде. Если нужна модифицированная его версия, то наследуйся.
Если исходить из твоего примера с переменной, пусть это будет HP. То ты можешь сделать это так (это псевдокод):
Код
class Entity : MonoBehaviour { protected int HP;
public void Damage(int value) { HP -= value; } }
Код
class Wizzard : Entity { protected int MP;
/* здесь любой дополнительный код */ }
class IceWizzard: Wizzard { private int iceSpellMpCost;
Т.е. что мы имеем, теперь каждый унаследованный от Entity класс уже будет иметь в себе поле для HP, метод для нанесения урона. Так же есть класс Wizzard, который может послужить тебе основной для других магов. Если посмотреть на любую игру, то её можно разбить на ряд базовых сущностей и их иерархию - это должно решить описанную тобой проблему, если я правильно её понял.
Хотя главная проблема вопроса была: как написать маленький скрипт на юнити? То есть нормально ли будет если у меня будет тонны скриптов типа, псевдокодом:
Скрипт у персонажа молочника, который после диалога откроет меню магазина:
Код
if (при использовании персонажа) { Talk("Привет! Как насчёт купить немного молока?"); OpenShop(); }
А вот второй микроскрипт, например у лавочки, при её использовании герой сядет на неё:
Код
if (при использовании лавочки) { Hero.SitOnIt(transform); OpenMenu("Подождать 1 час","Встать с лавочки"); }
Скрипты очень маленькие, неужели для каждого уникального персонажа и уникального объекта придётся писать отдельный скрипт с компиляцией или есть другой более простой выход?
Сообщение отредактировал alexsilent - Четверг, 11 Июня 2020, 16:40
Общего решения ты не найдёшь, нужно садится и анализировать повторяющиеся элементы, находить что-то общее и думать как из этого можно построить общий механизм. Можно ещё подумать в сторону прокачивания редактора. Но вряд ли это укладывается в идею "меньше кода"
Думаю, что ничего страшного в большом кол-ве таких маленьких классов нет. Вероятнее всего они окажутся сложнее в поддержке в будущем. А в остальном... можно юзать, если внутренний перфикционизм не беспокоит
Добавлено (11 Июня 2020, 16:46) --------------------------------------------- Ещё можно попробовать внедрить какой-то скриптовый язык типа lua, но вряд ли будет выигрыш от этого
Сообщение отредактировал Vostrugin - Четверг, 11 Июня 2020, 16:46
Печально, в этом плане Game Maker и Godot выгоднее отличаются, ибо там всё заточено под уникальные мини скрипты.
ЦитатаVostrugin ()
Ещё можно попробовать внедрить какой-то скриптовый язык типа lua, но вряд ли будет выигрыш от этого
Я написал свой скриптер парсер, ибо не нашёл нормально работающий в новых юнити плагин с Lua, но написал криво: 1) у меня все переменные, которые должны работать с такими мини скриптами находятся в глобальном и большом Dictionary, не уверен хорошо ли это, но доступ к этим переменным универсальный (доступ откуда угодно и через String) 2) парсер медленный, ведь надо всё разделить через Split, сделать Replace некоторым символам, убрать tab и другие штуки и чем больше мини скриптов и больше кода там, тем медленнее работает 3) пришлось писать много кода, если захочется сделать ещё одну другую игру, то придётся большую цепь базовых скриптов переносить в новый проект, это всё как костыль выглядит PS Единственный плюс, всё это работает без компиляции, что очень радует, для мини скриптов это то что нужно, жаль лучше способа не придумал, но вдруг есть более простая альтернатива.
Сообщение отредактировал alexsilent - Четверг, 11 Июня 2020, 17:13
У меня в Otti спефицика игры навязывало то, что будет много взаимодействий между объектами. Зачастую писал новый класс на каждый случай. Позже это обернулось тем, что если мне нужно было изменить какую-то их общую черту, то приходилось переворачивать весь проект вверх дном.
Если бы делал сейчас, то посмотрел бы в сторону рефлексии. К примеру посмотри как работают кнопки в юнити, когда ты можешь вызвать метод из указанного объекта. По идеи реализовать это было бы не очень сложно, но можно сэкономить много времени позже.
Или к примеру можно реализовать базовые "блоки" твоих скриптов. К примеру классы CommandOpenUIWindow, CommandSay, CommandSeat, каждый будет реализовать соответствующее поведение. А потом набросать скрипт для редактора, в котором можно будет добавлять эти блоки в произвольном порядке и заполнять их параметрами.
не нашёл нормально работающий в новых юнити плагин с Lua
UniLua работает. Минус - нет документации. Нужно разбираться самому.
Добавлено (11 Июня 2020, 21:17) ---------------------------------------------
Цитата
есть другой более простой выход
Обычно в таких ситуациях нужен более сильный программист, который сможет построить некую общую систему для этого. Пример - диалоги. Можно на каждого персонажа и на каждую фразу писать свой скрипт. А можно построить универсальную систему диалогов с расширением редактора. Так что при построении своих диалогов новых скриптов писать не придется.
alexsilent, Я в таких случаях использую один скрипт в который посылаю какой либо идентификатор, а уже там он выполнит всё что нужно. Цитата недели: Из-за леса, из-за гор, кишки, месиво, хардкор. (Берсерк ТВ-2)
использую один скрипт в который посылаю какой либо идентификатор
Ordan, а каким образом посылать идентификатор, через SendMessage?! Или есть какие-то другие удобные инструменты, о которых я не знал. Просто ищу какой-нибудь более простой способ решения проблемы.
PS например в Аниматоре есть возможность добавить в дорожку анимации Event, и там видны все функции, которые есть в моём скрипте, можно было бы также без аниматора обойтись, то было бы круто! Но я хз, гуглил по Event-ам разные уроки, но там надо сверху дополнительно программировать прослушку Event-ов, когда в аниматоре Event видит все функции без дополнительных строк кода, а не только те, где я пропишу специальные условия.
Сообщение отредактировал alexsilent - Пятница, 12 Июня 2020, 04:03
alexsilent, вооот, твой пример с event это как раз то, что я упоминал (такой же механизм у button есть). Его относительно не сложно реализовать. Вот в этом треде есть примеры кода.
а каким образом посылать идентификатор, через SendMessage?! Или есть какие-то другие удобные инструменты, о которых я не знал. Просто ищу какой-нибудь более простой способ решения проблемы.
Код
public static Buttonanager instance = null; void Awake() { if (instance == null) instance = this; }
Я просто объявляю скрипт и делаю доступ к нему из любого скрипта. В этом скрипте и есть та функция которая принимает айдишники и выполняет что требуют от него. Как вариант для эвента или разных объектов можно сделать мини скрипт который будет пересылать айдишник в Buttonanager(в моем случае). Цитата недели: Из-за леса, из-за гор, кишки, месиво, хардкор. (Берсерк ТВ-2)
alexsilent, Я так все менеджеры делаю, менеджеры персонажей, менеджеры БД и тд. И вот такие штучки значительно упрощают работу, без надобности в лишнем коде и минимизации в указателях. Правда я чаще пользуюсь массивами нежели листами.