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: Создание актора
- В вашей сцене создайте пустой GameObject там, где вы хотите разместить NPC.
- Добавьте компонент
Actor(или один из его вариантов:SimpleActor,TriggerActor). - Добавьте
SpriteRendererдля визуала NPC. - Актор автоматически зарегистрируется в
GridController.
Шаг 2: Открытие редактора CommandGraph
- Выберите ваш GameObject актора.
- В Inspector найдите секцию CommandGraph.
- Нажмите Edit Graph для открытия окна узлового редактора.
Шаг 3: Добавление узлов
- Щёлкните правой кнопкой мыши в редакторе графа для открытия меню Add Node.
- Узлы организованы по категориям (см. ниже).
- Выберите тип узла для добавления в граф.
- Соедините узлы, перетаскивая от выходного порта одного узла к входному порту другого.
Шаг 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]
Тестирование событий
- Войдите в Play Mode в редакторе.
- Переместите персонажа к актору.
- Нажмите кнопку взаимодействия (по умолчанию: Z или A на геймпаде).
- CommandGraph выполнится и вы сможете наблюдать за потоком.
Если граф ведёт себя не так, как ожидалось:
- Проверьте консоль на наличие ошибок.
- Убедитесь, что указанные GameVariables, предметы и монстры существуют.
- Убедитесь, что все выходные порты подключены -- неподключённая ветвь молча завершит граф.
- Используйте узлы
Debug(если доступны) для логирования состояний переменных во время выполнения.
Лучшие практики
- Давайте акторам описательные имена. "NPC_Professor_Lab" лучше, чем "Actor (3)".
- Используйте GameVariables для состояния. Не полагайтесь только на включение/отключение акторов.
- Тестируйте обе ветви. Каждый BranchOnVariable должен работать для путей True и False.
- Сохраняйте читаемость графов. Используйте пространственную организацию для наглядности потока. Группируйте связанные узлы.
- Переиспользуйте паттерны. Создав работающего NPC-торговца, дублируйте и модифицируйте для других магазинов.
- Сохраняйте перед тестированием. Изменения CommandGraph -- это изменения на уровне сцены, которые могут быть потеряны при вылете Unity.