Среда, 18 Декабря 2024, 04:50

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Как проще писать небольшие уникальные скрипты для Unity
alexsilentДата: Четверг, 11 Июня 2020, 14:35 | Сообщение # 1
почти ветеран
Сейчас нет на сайте
Как проще писать небольшие уникальные скрипты для Unity, не мучая каждый раз себя компиляцией
и не создавая сотни уникальных скриптов?

Например мне на уровне нужно при столкновении с кубом изменить переменную,
и таких небольших уникальных примеров на многих уровнях наберётся очень много,
неужели всегда надо создавать новый класс и писать новые строки, а потом каждый раз ждать компиляцию?
Да и для каждого уникального уровня придётся создавать ещё один класс с уникальным названием, что тоже плохо ибо их может наберётся сотни.



Сообщение отредактировал alexsilent - Четверг, 11 Июня 2020, 15:27
VostruginДата: Четверг, 11 Июня 2020, 15:35 | Сообщение # 2
постоянный участник
Сейчас нет на сайте
Не совсем понял что ты имеешь в виду с "микро скриптами", ты можешь написать класс и переиспользовать его везде. Если нужна модифицированная его версия, то наследуйся.

Если исходить из твоего примера с переменной, пусть это будет 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;

    private CastIceSpell() {
        if(MP < iceSpellMpCost) return;
        ...
    }
}


Т.е. что мы имеем, теперь каждый унаследованный от Entity класс уже будет иметь в себе поле для HP, метод для нанесения урона. Так же есть класс Wizzard, который может послужить тебе основной для других магов. Если посмотреть на любую игру, то её можно разбить на ряд базовых сущностей и их иерархию - это должно решить описанную тобой проблему, если я правильно её понял.




alexsilentДата: Четверг, 11 Июня 2020, 16:00 | Сообщение # 3
почти ветеран
Сейчас нет на сайте
Vostrugin, Спасибо!

Хотя главная проблема вопроса была: как написать маленький скрипт на юнити?
То есть нормально ли будет если у меня будет тонны скриптов типа, псевдокодом:

Скрипт у персонажа молочника, который после диалога откроет меню магазина:
Код

if (при использовании персонажа) {
Talk("Привет! Как насчёт купить немного молока?");
OpenShop();
}


А вот второй микроскрипт, например у лавочки, при её использовании герой сядет на неё:
Код

if (при использовании лавочки) {
Hero.SitOnIt(transform);
OpenMenu("Подождать 1 час","Встать с лавочки");
}


Скрипты очень маленькие, неужели для каждого уникального персонажа и уникального объекта
придётся писать отдельный скрипт с компиляцией или есть другой более простой выход?


Сообщение отредактировал alexsilent - Четверг, 11 Июня 2020, 16:40
VostruginДата: Четверг, 11 Июня 2020, 16:43 | Сообщение # 4
постоянный участник
Сейчас нет на сайте
Общего решения ты не найдёшь, нужно садится и анализировать повторяющиеся элементы, находить что-то общее и думать как из этого можно построить общий механизм. Можно ещё подумать в сторону прокачивания редактора. Но вряд ли это укладывается в идею "меньше кода" :)

Думаю, что ничего страшного в большом кол-ве таких маленьких классов нет. Вероятнее всего они окажутся сложнее в поддержке в будущем. А в остальном... можно юзать, если внутренний перфикционизм не беспокоит :)

Добавлено (11 Июня 2020, 16:46)
---------------------------------------------
Ещё можно попробовать внедрить какой-то скриптовый язык типа lua, но вряд ли будет выигрыш от этого






Сообщение отредактировал Vostrugin - Четверг, 11 Июня 2020, 16:46
alexsilentДата: Четверг, 11 Июня 2020, 17:04 | Сообщение # 5
почти ветеран
Сейчас нет на сайте
Цитата Vostrugin ()
Общего решения ты не найдёшь


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

Цитата Vostrugin ()
Ещё можно попробовать внедрить какой-то скриптовый язык типа lua, но вряд ли будет выигрыш от этого


Я написал свой скриптер парсер, ибо не нашёл нормально работающий в новых юнити плагин с Lua, но написал криво:
1) у меня все переменные, которые должны работать с такими мини скриптами находятся в глобальном и большом Dictionary, не уверен хорошо ли это, но доступ к этим переменным универсальный (доступ откуда угодно и через String)
2) парсер медленный, ведь надо всё разделить через Split, сделать Replace некоторым символам, убрать tab и другие штуки и чем больше мини скриптов и больше кода там, тем медленнее работает
3) пришлось писать много кода, если захочется сделать ещё одну другую игру, то придётся большую цепь базовых скриптов переносить в новый проект, это всё как костыль выглядит
PS Единственный плюс, всё это работает без компиляции, что очень радует, для мини скриптов это то что нужно, жаль лучше способа не придумал, но вдруг есть более простая альтернатива.


Сообщение отредактировал alexsilent - Четверг, 11 Июня 2020, 17:13
VostruginДата: Четверг, 11 Июня 2020, 17:23 | Сообщение # 6
постоянный участник
Сейчас нет на сайте
У меня в Otti спефицика игры навязывало то, что будет много взаимодействий между объектами. Зачастую писал новый класс на каждый случай. Позже это обернулось тем, что если мне нужно было изменить какую-то их общую черту, то приходилось переворачивать весь проект вверх дном.

Если бы делал сейчас, то посмотрел бы в сторону рефлексии. К примеру посмотри как работают кнопки в юнити, когда ты можешь вызвать метод из указанного объекта. По идеи реализовать это было бы не очень сложно, но можно сэкономить много времени позже.

Или к примеру можно реализовать базовые "блоки" твоих скриптов. К примеру классы CommandOpenUIWindow, CommandSay, CommandSeat, каждый будет реализовать соответствующее поведение. А потом набросать скрипт для редактора, в котором можно будет добавлять эти блоки в произвольном порядке и заполнять их параметрами.




seamanДата: Четверг, 11 Июня 2020, 21:14 | Сообщение # 7
старожил
Сейчас нет на сайте
Цитата
не нашёл нормально работающий в новых юнити плагин с Lua

UniLua работает.
Минус - нет документации. Нужно разбираться самому.

Добавлено (11 Июня 2020, 21:17)
---------------------------------------------

Цитата
есть другой более простой выход

Обычно в таких ситуациях нужен более сильный программист, который сможет построить некую общую систему для этого.
Пример - диалоги. Можно на каждого персонажа и на каждую фразу писать свой скрипт. А можно построить универсальную систему диалогов с расширением редактора. Так что при построении своих диалогов новых скриптов писать не придется.
alexsilentДата: Пятница, 12 Июня 2020, 00:37 | Сообщение # 8
почти ветеран
Сейчас нет на сайте
Цитата seaman ()
UniLua работает.
Минус - нет документации. Нужно разбираться самому.


Спасибо, seaman, возможно то что нужно, надеюсь что на мобилах оно тоже работает.


Сообщение отредактировал alexsilent - Пятница, 12 Июня 2020, 00:40
OrdanДата: Пятница, 12 Июня 2020, 02:11 | Сообщение # 9
Главный зомби
Сейчас нет на сайте
alexsilent, Я в таких случаях использую один скрипт в который посылаю какой либо идентификатор, а уже там он выполнит всё что нужно.

Цитата недели: Из-за леса, из-за гор, кишки, месиво, хардкор. (Берсерк ТВ-2)

Мои проекты ТЫК
Мои видяхи на ютубэ ТЫК

Если ты споришь с идиотом, вероятно тоже самое делает и он.
alexsilentДата: Пятница, 12 Июня 2020, 03:56 | Сообщение # 10
почти ветеран
Сейчас нет на сайте
Цитата Ordan ()
использую один скрипт в который посылаю какой либо идентификатор

Ordan, а каким образом посылать идентификатор, через SendMessage?! Или есть какие-то другие удобные инструменты, о которых я не знал. Просто ищу какой-нибудь более простой способ решения проблемы.

PS например в Аниматоре есть возможность добавить в дорожку анимации Event, и там видны все функции, которые есть в моём скрипте, можно было бы также без аниматора обойтись, то было бы круто! Но я хз, гуглил по Event-ам разные уроки, но там надо сверху дополнительно программировать прослушку Event-ов, когда в аниматоре Event видит все функции без дополнительных строк кода, а не только те, где я пропишу специальные условия.


Сообщение отредактировал alexsilent - Пятница, 12 Июня 2020, 04:03
VostruginДата: Пятница, 12 Июня 2020, 08:42 | Сообщение # 11
постоянный участник
Сейчас нет на сайте
alexsilent, вооот, твой пример с event это как раз то, что я упоминал (такой же механизм у button есть). Его относительно не сложно реализовать. Вот в этом треде есть примеры кода.



seamanДата: Пятница, 12 Июня 2020, 21:00 | Сообщение # 12
старожил
Сейчас нет на сайте
Цитата
надеюсь что на мобилах оно тоже работает.

Он написан на C# и не использует запрещенные на iOS фишки. Так что работает везде.
OrdanДата: Суббота, 13 Июня 2020, 02:21 | Сообщение # 13
Главный зомби
Сейчас нет на сайте
Цитата alexsilent ()
а каким образом посылать идентификатор, через SendMessage?! Или есть какие-то другие удобные инструменты, о которых я не знал. Просто ищу какой-нибудь более простой способ решения проблемы.

Код

public static Buttonanager instance = null;
    void Awake()
    {
        if (instance == null)
            instance = this;
    }


Я просто объявляю скрипт и делаю доступ к нему из любого скрипта. В этом скрипте и есть та функция которая принимает айдишники и выполняет что требуют от него. Как вариант для эвента или разных объектов можно сделать мини скрипт который будет пересылать айдишник в Buttonanager(в моем случае).


Цитата недели: Из-за леса, из-за гор, кишки, месиво, хардкор. (Берсерк ТВ-2)

Мои проекты ТЫК
Мои видяхи на ютубэ ТЫК

Если ты споришь с идиотом, вероятно тоже самое делает и он.
alexsilentДата: Суббота, 13 Июня 2020, 02:36 | Сообщение # 14
почти ветеран
Сейчас нет на сайте
Ordan, спасибо!
В принципе я примерно так делаю, с некоторыми вариациями, только для другой цели, можно попробовать и для менеджера сделать!)


Сообщение отредактировал alexsilent - Суббота, 13 Июня 2020, 02:44
OrdanДата: Понедельник, 15 Июня 2020, 02:10 | Сообщение # 15
Главный зомби
Сейчас нет на сайте
alexsilent, Я так все менеджеры делаю, менеджеры персонажей, менеджеры БД и тд.
И вот такие штучки значительно упрощают работу, без надобности в лишнем коде и минимизации в указателях. Правда я чаще пользуюсь массивами нежели листами.

Код

ПриродаБД Природа(int id)
    { return MapManager.instance.Природа[id]; }


Цитата недели: Из-за леса, из-за гор, кишки, месиво, хардкор. (Берсерк ТВ-2)

Мои проекты ТЫК
Мои видяхи на ютубэ ТЫК

Если ты споришь с идиотом, вероятно тоже самое делает и он.
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг