跳到主要内容

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 组件(或其变体之一:SimpleActor、TriggerActor)。
  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检查队伍中有多少只怪兽

每个分支节点有两个输出端口:True 和 False。

道具​

管理玩家的物品栏。

节点描述
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 崩溃可能会丢失。