Войти
UnityФорумПрограммирование

Вопрос про сериализацию линков на gameobject (2 стр)

Страницы: 1 2
#15
(Правка: 20:11) 17:09, 30 окт 2021

kkolyan
Мне видится такое решение
1. заводим СОшку DoorOpenEvent. сначала можно вообще без полей
2. для каждой открываемой через внешнее событие двери создаем в ассетах инстанс этой сошки с понятным именем
3. инжектим эту сошку через инспектор в DoorRotate (там заводим поле для этого)
4. инжектим ссылку на Door в "NodeData.door" в редакторе диалогов
5. в рантайме составляем обратный мэппинг в один проход как больше нравится

Вчера вечером немного поэкспериментировал по вашей наводке. Спасибо за подсказки!

Я немного иначе решил задачу, нежели ваш способ.
Чтобы не городить кастомные списки в NodeGraph, с контейнерами которых много проблем, решил использовать нативные, которые появляются в открывшемся окне, при нажатии на кружок в соответствующем визуальном элементе. До кучи получилось разделить списки по классам: Objects Doors, Lights:

+ Показать

Сперва добавил сверху в туллбар возможность создавать ScriptableObject с заданным именем (содержащий только соответствующий пустой класс), который и появляется в списке. Но эти манипуляции с пунктами меню перенесу в скрипт ObjectsReferences - там будут массивы слотов для соответствующих классов. При навешивании ссылки название слота автоматически переименуется именем объекта, на котором висит скрипт, а так же будет создан ScriptableObject с этим же именем. Далее пункт с этим названием появится в соответсвующем списке и его можно будет указать в нодах редактора миссий. Никаких лишних переименований и ручной работы. То, что я изначально и хотел добиться. Заодно исключается прямая адресация, к которой вы и FourGen относитесь скептически. Я с этим мнением согласен, однако в моём случае это было не критично. Хотя, возможно, до поры до времени)

Ну и для связи рантайма и режима Editor скрипт ObjectsReferences будет экспортировать в стандартный файл .asset массив соответствий названий слотов и ссылок на объекты в сцене. С этими данными в рантайме будет работать скрипт выполнения миссии, подгружая в конвеер индексы, и налету вынимая ссылки на объекты из скрипта ObjectsReferences. Менять скрипт управления дверьми посчитал нецелесообразным - у меня в пайплайне большинство объектов сцены экспортируется из cinema4d единым файлом и потом возится с дверями не хочется. В Unity есть ограничения, делающие неудобной расстановку дверей и прочих объектов. Мне кажется такая логика будет понятней даже не программирующим помощникам, которых в будущем возможно придётся подключать к реализации проекта.

Благодарю за комментарии! Вы очень сильно помогли!

#16
17:15, 30 окт 2021

FourGen
Если вы не реализовали еще что-то можно так же сделать используя систему токенов. Получается вообще универсальная штука. на дверь кликнули, проверяем есть ли токен или набор токенов, нет... не открываем... смотрим есть ли такие-то токены... не открываем... поговорили с персом... дали токен или несколько токенов, если надо забрали... удобно просто получается, и вложенность без ограничений.
Токен - что угодно... массив интов булов стрингов или структур с количеством этих токенов в
элементе.
Реализуется крайне легко, всего несколько процедур. Зато гибкость появляется без ограничений на любые действия.

Это такая система рейтинга? Не совсем понимаю суть.

Вообще система рейтинга потребуется для крафта - у меня в хорроре будет очень лаконичная система крафта, необходимая для создания серверов и майнинг-ферм. Находишь разные компоненты и используешь их наиболее эффективно.

#17
(Правка: 31 окт 2021, 13:02) 21:23, 30 окт 2021

Не совсем понимаю суть.

  • Вероятно это я навыдумал, и мне кажется все просто и понятно...
  • Для карфта, да такое же можно использовать без проблем я и пытался реализовать так, что бы оно было более или менее универсальным.

    (я о теме которая была давно: Ссылка и предложение скорее всего запоздало)
    У вас все с виду прикольно сделано, просто если туда добавить возможность выдавать/забирать некие объекты (у меня это просто int) сделать возможность проверять, есть ли такие то объекты, или наоборот нет таких то объектов у персонажа, это сильно расширит функционал.

    Пример:
    - Открыли диалог с каким-то npc
    - тыкнули по второму пункту, получили ответ
    и так же скрытый некий объект, например куда-то записалось (123)

    Подходим к двери, тыкаем открыть... а там если есть 123 не открывать, а выдать 321
    Подходим к некому другому npc тыкаем... есть 123 и 321... отобразить диалог, как открыть дверь, забрать 123 и 321, выдать 456.

    Подходим к двери, тыкаем открыть ... есть 456 открываем, выдаем, например 654
    возвращаемся к npc, есть 654, необходимо выполнить действие такое то. забираем 456 и 654, выполняем действие выдаем еще что-то если надо.

    То есть достаточно просто можно комбинировать действия любых типов, объектов и тд.
    Но тут проблема с тем, что без визуального редактора, это будет проблемой если что-то понадобится поменять. Достаточно много параметров. + оно не сильно визуально, точнее сосем не визуально и понятно только на момент когда расставляешь что кому давать и забирать.

    У вас же есть визуальный редактор, если добавить подобное, вероятно вам потом будет проще делать диалоги и квесты.

    Может так более понятно будет

     *псевдокод
    if (IsTokenExist(1))
    {показать диалог 123}
    else
    {показать диалог 321}
    
    или
    
    if (IsTokenExist(1) && (NeedAction == true))
    { выполнить действие ActionNumber }

    Ну и комбинация всего этого в любых видах и подвидах по необходимости.

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

    P. S. Запоздало добавлю:
    На основе этого, так же можно понимать, как вел себя игрок играя в игру. Куда пошел, на что тыкнул, где вышел и тд. То есть не нужно городить отдельную систему для этого.

    #18
    8:36, 1 ноя 2021

    FourGen
    То есть достаточно просто можно комбинировать действия любых типов, объектов и тд.
    Но тут проблема с тем, что без визуального редактора, это будет проблемой если что-то понадобится поменять. Достаточно много параметров. + оно не сильно визуально, точнее сосем не визуально и понятно только на момент когда расставляешь что кому давать и забирать.

    Теперь понятно. Это такая система событий. Нечто похожее я реализовал у себя. Теперь остаётся уточнить тонкости архитектуры и добавить что-то и в редактор миссий.

    FourGen
    На основе этого, так же можно понимать, как вел себя игрок играя в игру. Куда пошел, на что тыкнул, где вышел и тд. То есть не нужно городить отдельную систему для этого.

    Кстати, да. Про действия игрока я пока не думал. Спасибо!

    #19
    (Правка: 8:44) 8:43, 1 ноя 2021

    В итоге вышло ещё проще: сохраняю ID ссылки в сам ScriptableObject с именем объекта, на который ведёт ссылка, а оттуда его берёт редактор миссий при экспорте. Никаких дополнительных файлов не надо.

    Ну и слоты с ссылками вышли такими:

    + Показать

    Всем спасибо!!!

    Страницы: 1 2
    UnityФорумПрограммирование