Перейти к основному содержимому

CommandGraph: Узловая система событий

CommandGraph -- это система визуального скриптинга MCE для создания поведения NPC, катсцен, квестов и интерактивных событий. Она предоставляет узловой редактор, где вы соединяете команды для определения последовательностей событий -- без необходимости написания кода на C#.

Это основной инструмент для гейм-дизайнеров, работающих с MCE на всех уровнях, включая DLL-уровни, где исходный код недоступен.

Что такое CommandGraph?

CommandGraph -- это граф узлов, прикреплённый к Actor (любой интерактивной сущности в мире). Когда игрок активирует актора (взаимодействуя, наступая на него или входя в его область), граф выполняет свои узлы последовательно.

Представьте его как визуальный скрипт, где каждый узел -- игровое действие:

[Start] -> [Show Dialog] -> [Branch: Has Badge?]
|-- Yes -> [Give Item] -> [End]
|-- No -> [Show Dialog: "Come back later"] -> [End]

Создание первого события

Шаг 1: Создание актора

  1. В вашей сцене создайте пустой GameObject там, где вы хотите разместить NPC.
  2. Добавьте компонент Actor (или один из его вариантов: SimpleActor, TriggerActor).
  3. Добавьте SpriteRenderer для визуала NPC.
  4. Актор автоматически зарегистрируется в GridController.

Шаг 2: Открытие редактора CommandGraph

  1. Выберите ваш GameObject актора.
  2. В Inspector найдите секцию CommandGraph.
  3. Нажмите Edit Graph для открытия окна узлового редактора.

Шаг 3: Добавление узлов

  1. Щёлкните правой кнопкой мыши в редакторе графа для открытия меню Add Node.
  2. Узлы организованы по категориям (см. ниже).
  3. Выберите тип узла для добавления в граф.
  4. Соедините узлы, перетаскивая от выходного порта одного узла к входному порту другого.

Шаг 4: Настройка узлов

Нажмите на узел, чтобы увидеть его свойства в панели Inspector:

  • Узлы диалогов: Введите текст для отображения, имя говорящего и портрет.
  • Узлы ветвлений: Выберите проверяемую игровую переменную и сравнение.
  • Узлы предметов: Выберите предмет для выдачи/изъятия и количество.
  • Узлы телепортов: Установите целевую сцену и позицию.

Типы акторов

MCE предоставляет несколько вариантов акторов:

Тип актораТриггерПрименение
ActorИгрок взаимодействует (нажимает кнопку действия, стоя перед)NPC, знаки, объекты
SimpleActorИгрок взаимодействует, упрощённая настройкаПростые NPC
TriggerActorИгрок наступает или входит в областьАвтотриггеры, скрытые события
GridSubscribingActorРеагирует на события сеткиНажимные плиты, приближение
PushableActorИгрок толкает, идя в негоВалуны, блоки головоломок
ActorItemИгрок взаимодействует, выдаёт предмет и исчезаетПодбираемые предметы на земле

Категории узлов

Диалоги

Показ текста, выбор ответов и управление разговорами.

УзелОписание
ShowDialogОтображение текстового окна с сообщением говорящего
ShowChoiceDialogПредоставление игроку множественного выбора
ShowMonsterDialogОтображение диалога о монстре (показывает спрайт)
CharacterPopUpПоказ всплывающего окна над головой NPC (!, ?, ...)

Ветвления

Управление потоком на основе условий.

УзелОписание
BranchOnVariableПроверка GameVariable и ветвление Да/Нет
BranchOnBadgeПроверка наличия определённого значка
BranchOnItemПроверка наличия определённого предмета
BranchOnMonsterПроверка наличия определённого вида в отряде
BranchOnMoneyПроверка наличия достаточного количества денег
BranchOnRosterCountПроверка количества монстров в отряде

Каждый узел ветвления имеет два выходных порта: True и False.

Предметы

Управление инвентарём игрока.

УзелОписание
GiveItemДобавить предмет в инвентарь игрока
TakeItemУдалить предмет из инвентаря
GiveMonsterДобавить монстра в отряд
GiveMoneyДобавить деньги
TakeMoneyУдалить деньги

Монстры

Взаимодействие с монстрами игрока.

УзелОписание
HealPartyПолностью вылечить всех монстров в отряде
SelectMonsterОткрыть экран отряда для выбора монстра
TeachMoveОбучить определённому приёму
EvolutionCheckЗапустить проверки эволюции для всех членов отряда
SetNicknameПозволить игроку переименовать монстра

Сражения

Запуск и настройка боёв.

УзелОписание
StartTrainerBattleНачать тренерский бой с настроенной командой
StartWildBattleНачать дикую встречу с определённым монстром
BranchOnBattleResultПроверить, выиграл ли игрок последний бой

Переменные

Чтение и запись игрового состояния.

УзелОписание
SetVariableУстановить значение GameVariable
AddToVariableДобавить к числовой GameVariable
CheckVariableПрочитать значение GameVariable для логики

GameVariables -- система глобального состояния. Они сохраняются в данных сохранения и могут быть проверены из любого CommandGraph или скрипта.

Звуки

Управление воспроизведением аудио.

УзелОписание
PlayBGMИзменить фоновую музыку
PlaySEВоспроизвести звуковой эффект
StopBGMОстановить текущую музыку
FadeOutBGMПлавно убрать музыку

Анимации

Анимация персонажей и камеры.

УзелОписание
MoveActorПереместить NPC в целевую позицию
TurnActorПовернуть NPC в направлении
WaitSecondsПриостановить граф на время
FadeScreenЗатемнить экран или восстановить
ShakeScreenВстряхнуть камеру

Телепорты

Перемещение игрока между локациями.

УзелОписание
TeleportPlayerПереместить игрока на определённый тайл в текущей сцене
WarpToSceneПеренести игрока в другую сцену

Квесты (уровень Pro+)

Управление прогрессом квестов.

УзелОписание
StartQuestНачать квест
CompleteObjectiveОтметить цель квеста как выполненную
FailQuestПровалить квест
BranchOnQuestStateПроверить текущее состояние квеста
GiveQuestRewardВыдать награды за квест

Магазины

Открытие интерфейсов магазинов.

УзелОписание
OpenShopОткрыть UI магазина покупки/продажи с настроенным списком товаров

Сохранения

Управление данными сохранения.

УзелОписание
SaveGameЗапустить сохранение в текущий слот

Утилиты

Разные вспомогательные узлы.

УзелОписание
DeactivateActorСкрыть актора (например, после выдачи подбираемого предмета)
EnablePlayerВключить/отключить перемещение игрока

Соединение узлов

CommandGraph использует потоковую модель соединений:

  • Каждый узел имеет входной порт (слева) и один или несколько выходных портов (справа).
  • Соедините выходной порт с входным портом другого узла для определения порядка выполнения.
  • Узлы ветвлений имеют подписанные выходные порты (True/False, Choice1/Choice2 и т.д.).
  • Узел без подключённого выходного порта завершает выполнение графа.

Пример: NPC-торговец

[Start]
-> [ShowDialog: "Добро пожаловать! Хотите посмотреть мои товары?"]
-> [ShowChoiceDialog: "Купить" / "Продать" / "Нет, спасибо"]
|-- Choice 1 ("Купить") -> [OpenShop: item_list_potions]
|-- Choice 2 ("Продать") -> [OpenShop: sell_mode]
|-- Choice 3 ("Нет, спасибо") -> [ShowDialog: "Заходите ещё!"]

Пример: NPC-квестодатель

[Start]
-> [BranchOnVariable: "rescued_lost_monster" == true]
|-- True -> [ShowDialog: "Спасибо, что нашли моего монстра!"]
| -> [BranchOnVariable: "quest_reward_given" == true]
| |-- True -> [ShowDialog: "Наслаждайтесь TM!"]
| |-- False -> [GiveItem: TM_Thunderbolt, 1]
| -> [SetVariable: "quest_reward_given" = true]
| -> [ShowDialog: "Примите это в благодарность!"]
|-- False -> [ShowDialog: "Пожалуйста, помогите найти моего потерянного монстра!"]
-> [ShowDialog: "Он убежал в пещеру к северу."]
-> [SetVariable: "quest_find_monster" = true]

Тестирование событий

  1. Войдите в Play Mode в редакторе.
  2. Переместите персонажа к актору.
  3. Нажмите кнопку взаимодействия (по умолчанию: Z или A на геймпаде).
  4. CommandGraph выполнится и вы сможете наблюдать за потоком.
Режим отладки

Если граф ведёт себя не так, как ожидалось:

  1. Проверьте консоль на наличие ошибок.
  2. Убедитесь, что указанные GameVariables, предметы и монстры существуют.
  3. Убедитесь, что все выходные порты подключены -- неподключённая ветвь молча завершит граф.
  4. Используйте узлы Debug (если доступны) для логирования состояний переменных во время выполнения.

Лучшие практики

  1. Давайте акторам описательные имена. "NPC_Professor_Lab" лучше, чем "Actor (3)".
  2. Используйте GameVariables для состояния. Не полагайтесь только на включение/отключение акторов.
  3. Тестируйте обе ветви. Каждый BranchOnVariable должен работать для путей True и False.
  4. Сохраняйте читаемость графов. Используйте пространственную организацию для наглядности потока. Группируйте связанные узлы.
  5. Переиспользуйте паттерны. Создав работающего NPC-торговца, дублируйте и модифицируйте для других магазинов.
  6. Сохраняйте перед тестированием. Изменения CommandGraph -- это изменения на уровне сцены, которые могут быть потеряны при вылете Unity.