跳到主要内容

CommandGraph:基于节点的事件脚本

CommandGraph 是 MCE 的可视化脚本系统,用于创建 NPC 行为、过场动画、任务和交互事件。它提供基于节点的编辑器,你可以连接命令来定义事件序列——无需编写 C# 代码。

这是所有版本(包括无法访问源代码的 DLL 版本)的游戏设计师使用 MCE 时的主要工具。

什么是 CommandGraph?

CommandGraph 是附加到 Actor(世界中任何可交互实体)的节点图。当玩家触发 Actor(通过交互、踩上去或进入其区域),图表按顺序执行其节点。

可以将其理解为可视化脚本,每个节点是一个游戏动作:

[Start] → [Show Dialog] → [Branch: Has Badge?]
├─ Yes → [Give Item] → [End]
└─ No → [Show Dialog: "Come back later"] → [End]

创建你的第一个事件

步骤 1:创建 Actor

  1. 在场景中,在你希望放置 NPC 的位置创建一个空 GameObject。
  2. 添加 Actor 组件(或其变体之一:SimpleActorTriggerActor)。
  3. 添加 SpriteRenderer 作为 NPC 的视觉表现。
  4. Actor 将自动注册到 GridController

步骤 2:打开 CommandGraph 编辑器

  1. 选择你的 Actor GameObject。
  2. 在 Inspector 中,找到 CommandGraph 部分。
  3. 点击 Edit Graph 打开节点编辑器窗口。

步骤 3:添加节点

  1. 在图编辑器中右键打开添加节点菜单。
  2. 节点按类别组织(见下文)。
  3. 选择节点类型将其添加到图中。
  4. 通过从一个节点的输出端口拖到另一个节点的输入端口来连接节点。

步骤 4:配置节点

点击节点在 Inspector 面板中查看其属性:

  • 对话节点:输入要显示的文字、说话者名称和头像。
  • 分支节点:选择要检查的游戏变量和比较方式。
  • 道具节点:选择要给予/获取的道具及数量。
  • 传送节点:设置目标场景和位置。

Actor 类型

MCE 提供多种 Actor 变体:

Actor 类型触发方式使用场景
Actor玩家交互(面对时按互动按钮)NPC、路标、物体
SimpleActor玩家交互,简化设置基础 NPC
TriggerActor玩家踩上或进入区域自动触发、隐藏事件
GridSubscribingActor响应网格事件压力板、近距离触发
PushableActor玩家走向它时推动巨石、谜题方块
ActorItem玩家交互,给予道具后消失地面上的道具拾取

节点类别

对话

显示文字、选择回复和管理对话。

节点描述
ShowDialog显示包含说话者消息的文本框
ShowChoiceDialog向玩家展示多选项
ShowMonsterDialog显示与怪兽相关的对话(展示精灵图)
CharacterPopUp在 NPC 头顶显示弹出图标(!、?、...)

ShowDialog 示例:

Speaker: "Professor Elm"
Text: "Welcome to the world of monsters!"
Portrait: oak_portrait
Wait for Input: true

分支

根据条件控制流程。

节点描述
BranchOnVariable检查 GameVariable 并分支为是/否
BranchOnBadge检查玩家是否拥有特定徽章
BranchOnItem检查玩家是否拥有特定道具
BranchOnMonster检查玩家队伍中是否有特定物种
BranchOnMoney检查玩家是否有足够的金钱
BranchOnRosterCount检查队伍中有多少只怪兽

每个分支节点有两个输出端口:TrueFalse

道具

管理玩家的物品栏。

节点描述
GiveItem向玩家背包中添加道具
TakeItem从玩家背包中移除道具
GiveMonster向玩家队伍中添加怪兽
GiveMoney向玩家钱包中添加金钱
TakeMoney从玩家钱包中扣除金钱

怪兽

与玩家的怪兽交互。

节点描述
HealParty完全治疗队伍中所有怪兽
SelectMonster打开队伍界面让玩家选择怪兽
TeachMove教授特定招式给怪兽
EvolutionCheck触发所有队伍成员的进化检查
SetNickname让玩家重命名怪兽

战斗

触发和配置战斗。

节点描述
StartTrainerBattle开始带有配置队伍的训练师战斗
StartWildBattle开始与特定怪兽的野生遭遇
BranchOnBattleResult检查玩家是否赢得了上一场战斗

变量

读写游戏状态。

节点描述
SetVariable将 GameVariable 设为某值
AddToVariable向数值 GameVariable 添加值
CheckVariable读取 GameVariable 的值用于逻辑判断

GameVariable 是全局状态系统。它们持久化在存档数据中,可以从任何 CommandGraph 或脚本中检查。

音频

控制音频播放。

节点描述
PlayBGM更改背景音乐
PlaySE播放音效
StopBGM停止当前音乐
FadeOutBGM在一段时间内淡出音乐

动画

为角色和摄像机添加动画。

节点描述
MoveActor将 NPC 移动到目标位置
TurnActor让 NPC 面向某个方向
WaitSeconds暂停图表执行一段时间
FadeScreen将屏幕淡出为黑色或淡入
ShakeScreen震动摄像机

传送

在不同位置之间移动玩家。

节点描述
TeleportPlayer将玩家移动到当前场景的特定地块
WarpToScene将玩家传送到另一个场景

任务(Pro 版本+)

管理任务进度。

节点描述
StartQuest开始一个任务
CompleteObjective将任务目标标记为完成
FailQuest使任务失败
BranchOnQuestState检查任务的当前状态
GiveQuestReward发放任务奖励

商店

打开商店界面。

节点描述
OpenShop使用配置的道具列表打开买卖商店 UI

存档

管理存档数据。

节点描述
SaveGame触发保存到当前栏位

工具

各种实用节点。

节点描述
DeactivateActor隐藏 Actor(例如给予道具拾取后)
EnablePlayer启用/禁用玩家移动

连接节点

CommandGraph 使用基于流程的连接模型:

  • 每个节点有一个输入端口(左侧)和一个或多个输出端口(右侧)。
  • 将输出端口连接到另一个节点的输入端口以定义执行顺序。
  • 分支节点有标记的输出端口(True/False、Choice1/Choice2 等)。
  • 没有连接输出端口的节点会结束图表执行。

示例:商店 NPC

[Start]
→ [ShowDialog: "Welcome! Would you like to browse my wares?"]
→ [ShowChoiceDialog: "Buy" / "Sell" / "No thanks"]
├─ Choice 1 ("Buy") → [OpenShop: item_list_potions]
├─ Choice 2 ("Sell") → [OpenShop: sell_mode]
└─ Choice 3 ("No thanks") → [ShowDialog: "Come back anytime!"]

示例:任务发布者

[Start]
→ [BranchOnVariable: "rescued_lost_monster" == true]
├─ True → [ShowDialog: "Thank you for finding my monster!"]
│ → [BranchOnVariable: "quest_reward_given" == true]
│ ├─ True → [ShowDialog: "Enjoy the TM!"]
│ └─ False → [GiveItem: TM_Thunderbolt, 1]
│ → [SetVariable: "quest_reward_given" = true]
│ → [ShowDialog: "Take this as thanks!"]
└─ False → [ShowDialog: "Please help me find my lost monster!"]
→ [ShowDialog: "It ran off into the cave to the north."]
→ [SetVariable: "quest_find_monster" = true]

示例:道馆馆主

[Start]
→ [BranchOnBadge: "BoulderBadge"]
├─ HasBadge → [ShowDialog: "You've already proven yourself!"]
└─ NoBadge
→ [ShowDialog: "I am the Gym Leader! Prepare for battle!"]
→ [StartTrainerBattle: gym_leader_team]
→ [BranchOnBattleResult]
├─ Won → [ShowDialog: "Impressive! You've earned this."]
│ → [GiveBadge: "BoulderBadge"]
│ → [GiveItem: TM_RockTomb, 1]
└─ Lost → [ShowDialog: "Train harder and come back!"]

测试事件

  1. 在编辑器中进入播放模式
  2. 将角色走到 Actor 旁边。
  3. 按下互动按钮(默认:Z 键或手柄 A 键)。
  4. CommandGraph 将执行,你可以观察流程。
调试模式

如果图表表现不如预期:

  1. 检查控制台中的错误。
  2. 验证引用的 GameVariable、道具和怪兽是否存在。
  3. 确保所有输出端口都已连接——未连接的分支会静默结束图表。
  4. 使用 Debug 节点(如果可用)在执行期间记录变量状态。

最佳实践

  1. 给 Actor 取描述性名称。"NPC_Professor_Lab" 比 "Actor (3)" 好得多。
  2. 使用 GameVariable 管理状态。不要仅依赖 Actor 的启用/禁用。
  3. 测试两个分支。每个 BranchOnVariable 的 True 和 False 路径都应该正常工作。
  4. 保持图表可读。使用空间布局使流程清晰。将相关节点分组放置。
  5. 复用模式。一旦你有了一个可工作的商店 NPC,复制并修改它以用于其他商店。
  6. 测试前保存。CommandGraph 的更改是场景级别的更改,如果 Unity 崩溃可能会丢失。