行为与自动化
平台上大多数世界根本不用规则。排名第一的世界(大逃杀)一条也没有。只有约 22% 的世界使用行为系统,而使用的世界往往只用在极少数 AI 无法保持一致性的特定场景。
本指南教你什么时候规则值得用、它们擅长什么、以及如何构建它们。关于触发器、条件和动作的基础知识,请参阅入门指南:自动化。
规则什么时候值得用(什么时候不值得)
新手创作者在规则方面犯的最常见错误就是过度工程化。他们看到编辑器里的行为部分就觉得「我应该把所有东西都自动化」。然后建了 30 条规则来复制精心编写的条目本身就能处理的事情,世界反而变得机械而不是生动。
规则是为了精确。 它们解决的是 AI 的不一致性会破坏体验的问题:
| 问题 | 为什么规则能解决 |
|---|---|
| 「玩家应该在好感度恰好到 75 时收到通知」 | AI 不知道确切数字——引擎知道 |
| 「进入竞技场时切换到战斗音乐」 | AI 有一半时间会忘记音频指令 |
| 「每 3 回合增加饥饿度」 | AI 有时第 2 回合就做了,有时完全忘记 |
| 「HP 归零的瞬间必须出现死亡画面」 | 你承受不起 AI 哪怕一次搞错 |
条目是为了叙事。 它们解决的是需要灵活性和细微差别的问题:
| 问题 | 为什么条目能解决 |
|---|---|
| 「随着信任增长改变 NPC 的说话方式」 | 条件条目给 AI 行为指导,而非死板脚本 |
| 「玩家到达某地时展示设定」 | 关键词触发的条目自然融入 AI 的上下文 |
| 「进入地牢时改变基调」 | 条目描述氛围;规则只能注入一条指令 |
经验法则: 如果你在规则的 inject-directive 动作中写了一大段叙事文本,你可能应该用条件条目代替。规则是开关和旋钮。条目是实际内容。
樱花季如何同时使用两者
樱花季是规则和条目协同工作的最佳范例。它有 9 条规则——全部做同样的基本工作:监视好感度阈值。
条目描述每位女主角在不同好感度级别的行为方式(警戒、升温、脆弱)。规则处理精确时刻:好感度到 25 时弹出通知(「看起来你引起了 Hina 的注意...」),到 50 时注入指令告诉 AI 描写矛盾的推拉行为,到 75 时弹出成就提示触发告白弧。
条目承担重任。规则只确保里程碑在恰当的时刻到来。
触发器类型详解
触发器决定何时引擎检查这个行为。可以把它们想象成不同类型的闹钟。
你真正会用到的
变量越过阈值(variable-crossed)——最受欢迎的触发器,理由充分。它在数值变量确切越过特定线的那一刻触发。
这和每回合检查「生命值是否低于 20」不同。越过触发器只触发一次,在值实际跨越阈值的那一刻。如果生命值已经在 10 且保持在 10,不会再次触发。
你设置三项:哪个变量、哪个阈值、哪个方向(rises-above 或 drops-below)。
流浪日记用三个这样的触发器实现区域切换:当 distance 变量越过 50 时,玩家进入县城;越过 150,进入山区;越过 200,到达省会。每个阈值设置新的 region 变量并弹出通知。
状态变化(state-change)——最广泛的触发器。任何变量变化时都会触发。搭配条件来缩小你关心的范围。
当你想对变量处于某个特定值做出反应(而非越过阈值)时使用。例如:「每当任何状态变化时,检查 location 是否等于 dark_forest,如果是就播放诡异音乐。」规则在任何东西变化时都重新检查,意味着无论什么导致了地点变化它都能捕捉到。
每 N 回合(turn-count)——按时间表触发。设 everyNTurns: 3,它在第 3、6、9、12 回合触发。或者设 atTurn: 10 在特定回合一次性触发。
适合生存机制(饥饿度递增)、节奏事件(第 20 回合警告时间快到了)或周期性提醒。
每回合(every-turn)——每次玩家/AI 交换后触发。谨慎使用——每回合都触发且每次都做可见操作的规则会惹恼玩家。最好搭配条件过滤掉大多数回合,或用于静默的后台记录。
会话开始(session-start)——新对话开始时触发一次。适合初始化:设置起始值、显示欢迎消息或播放开场音乐。
不太常用的触发器
玩家关键词(keyword)——当玩家消息包含特定词时触发。与知识库关键词相同的匹配选项:全词匹配、模糊匹配和二级关键词过滤(AND_ANY、AND_ALL、NOT_ANY、NOT_ALL)。
AI 关键词(ai-keyword)——与上面相同,但扫描的是 AI 的回复。适合对 AI 写的内容做出反应,比如「当 AI 提到『战斗开始』时,切换音乐」。
手动(manual)——只在自定义组件通过 api.executeAction() 显式调用时触发。适用于有自定义 UI 的世界,按钮按下触发游戏逻辑。
动作(action)——当特定的自定义动作按钮被按下时触发。
计时器触发器
计时器触发器(timer:fired)和计时器动作(start-timer、cancel-timer)在编辑器中可见,但计时器运行时尚未启用。你可以在设计中使用它们,但在当前版本中计时器不会在游戏过程中倒计时。这项功能正在积极开发中。
条件:ONLY IF 检查
规则使用与条目相同的条件系统——相同的 7 种运算符(eq、neq、gt、gte、lt、lte、contains),相同的 All/Any 组合逻辑。完整的运算符参考请参阅写好条目的技巧:状态驱动条目。
如果条件留空,规则每次触发器匹配时都会执行。
动作类型:规则能做什么
条件通过后,引擎按顺序执行动作。单条规则可以有多个动作——这就是规则强大的地方。
修改变量
直接修改游戏状态变量。九种操作:set、add、subtract、multiply、toggle、append、merge、push、delete。
最常用的:set(覆盖值)、add/subtract(增减数值)和 toggle(翻转布尔值)。
注入指令
向 AI 的 prompt 添加临时指令。这可以说是最强大的动作,因为它改变了 AI 被告知要做什么,从而改变整个叙事方向。
你给它一个唯一 ID(这样以后可以移除)、指令文本,以及放在 prompt 中的位置(top、before_char、after_char、bottom、depth 或 auto)。
默认情况下,注入的指令跨回合持续(persistent: true)。你也可以设置 duration 使其在 N 个回合后自动过期。
樱花季在每位女主角好感度到 50 时使用这个。当 Rin 达到 50 时,规则注入:「Rin 的好感度进入了更深的阶段。冰层正在开裂。她会在委员会会议上说不必要的话,无意识地在天台分享她对一本书的想法然后突然沉默。」 AI 从那一刻起每回合都读到这段,自然地调整对角色的刻画。
移除指令
移除之前注入的指令。通过相同的 directiveId 引用。
发送上下文
向 AI 发送一条不可见消息并触发回复。玩家看不到这条消息,但 AI 读到它并据此回应。适合强制叙事节拍:「一只怪物出现了!描述一次随机遭遇。」
切换条目
通过 ID 启用或禁用知识库条目。使用 toggle-entry 并设 enabled: true 的规则可以在适当时机揭示隐藏的设定。
切换规则
启用或禁用另一个行为。这是构建链式反应的关键:规则 A 在进入地牢时激活并开启规则 B(每回合触发的怪物遭遇)。规则 C 在离开地牢时关闭规则 B。
通知玩家
弹出 toast 通知。四种样式:
| 样式 | 外观 | 适用场景 |
|---|---|---|
info | 蓝色 | 中性更新(「你进入了新区域」) |
achievement | 金色 | 里程碑和解锁 |
warning | 黄色 | 警告(「你的物资快用完了」) |
danger | 红色 | 紧急警报(「你倒下了」) |
播放音频
控制背景音乐和音效。需要一个 trackId(匹配你音频设置中的曲目)、一个 action(play、stop、crossfade、volume),以及可选的 volume 和 fadeDuration 设置。
已发布世界中的真实模式
好感度阈值(樱花季)
经典用例。樱花季有 9 条规则横跨三位女主角,每位遵循相同的三阶模式:
好感度 25 时 — 一条微妙的 info 通知。「看起来你引起了 Hina 的注意...」加上将 story_phase 设为「daily」。一次性触发(maxFireCount: 1)。
好感度 50 时 — 一条 achievement 通知。「Hina 开始把你当作特别的人了...」加上注入描述她矛盾推拉行为的指令,加上将 story_phase 设为「deepening」。一次性触发。
好感度 75 时 — 高潮触发器。achievement 通知,安排告白场景的指令,story_phase 设为「climax」。一次性触发。
注意模式:每条规则使用 variable-crossed + rises-above,恰好触发一次,并将玩家通知、AI 指令和阶段变量更新组合在一起。三种动作类型协同创造一个有意义的时刻。
区域切换(流浪日记)
流浪日记追踪一个 distance 变量,随玩家旅行而增加。三条 variable-crossed 规则在距离 50、150 和 200 处切换 region 变量,每次弹出通知:「你终于走出了荒野,进入了县城地界」「过了县城,一望无际的山脉在你面前延展」「远处,省会的轮廓出现在视野中」。
这创造了无缝的旅行进程,不需要 AI 追踪距离或记住区域边界。
死亡触发器
流浪日记和生存套件模板都使用相同的模式:variable-crossed 监测生命值降到 1 以下,配合 danger 样式的通知。关键细节:
- Priority 100 — 死亡应该在其他一切之前被评估
- maxFireCount: 1 — 死亡通知只触发一次(虽然大多数世界不在意这个,因为你不会两次降到零以下)
- 有时搭配
inject-directive告诉 AI 描述角色的死亡
地牢激活链
RPG 世界中的常见模式:规则 A 监听进入地牢(关键词触发或 state-change + 条件),然后用 toggle-rule 激活规则 B(每回合触发的怪物遭遇,带冷却时间)。第三条规则监听离开地牢并关闭规则 B。
这让怪物遭遇限定在特定区域,不需要 AI 追踪玩家是否在地牢中。
引擎如何处理规则
每次玩家消息、AI 回复或状态变化后,引擎在一次遍历中检查所有行为:按优先级排序(最高优先),然后依次检查。对每个行为,它问:是否启用?触发器类型是否匹配当前事件?触发器细节是否匹配(找到关键词、越过阈值等)?条件是否通过?是否还在冷却期?是否超过最大触发次数?如果一切通过,动作被收集。所有行为检查完后,收集的动作按顺序执行。如果这些动作修改了变量,引擎可能重新评估(有深度限制以防无限循环)。
整个过程对玩家不可见——他们只看到结果:一条通知、一次音乐切换、一次变量更新。
控制规则何时触发
优先级
数字越大越先评估。当多条规则同时触发时,优先级决定顺序。
实用建议:死亡检查设 100,故事里程碑设 50,环境效果设 10-20。不需要精确——只要确保关键规则在可有可无的规则之前运行。
冷却期
触发后,规则休眠指定回合数。一个冷却为 5 回合的饥饿警告不会每回合都烦玩家——它至少等 5 个回合。
最大触发次数
规则最多触发这么多次。maxFireCount: 1 使其成为一次性事件——非常适合成就、首次教程和故事里程碑。
启用/禁用状态
规则默认启用,但你可以设 enabled: false 创建休眠规则,只在另一条规则通过 toggle-rule 开启它时才激活。这是上述地牢激活模式的基础。
常见错误
条目能解决的问题用了规则做过度工程。 如果你发现自己在 inject-directive 动作中写了大段叙事文本,你可能需要的是条件条目。规则注入一两句引导。条目提供整段上下文。
用了 state-change 但其实想用 variable-crossed。 state-change 在任何变量变化时触发。如果你想要「生命值降到 20 以下时通知我」,用 variable-crossed——它在越过点触发一次。state-change + 条件检查 health < 20 会在生命值低于 20 期间每次状态变化时都触发,这可能不是你想要的。
频繁触发器忘了冷却。 没有冷却的 every-turn 规则每回合都触发。如果它弹通知,你的玩家会被刷屏。永远问自己:「玩家实际应该多久看到一次这个?」
一个需要 3 条规则的世界建了 30 条。 看看樱花季:9 条规则,3 位女主角,每人 3 个阈值。那是一个有深度机制的世界。大多数世界需要更少。大逃杀零条规则却是平台上最多人玩的世界。从条目和变量开始。只在你发现 AI 在某件具体事情上不一致时才添加规则。
不测试阈值。 如果你的规则在 health < 10 时触发,但你的 AI 实际上从来不让生命值降那么低(因为你的条目告诉它「当生命值低于 30 时描述玩家受伤」),规则永远不会触发。确保你的阈值与世界实际运作方式一致。
延伸阅读
完整规则 schema 和评估管线 → World Spec: Rules & Reactions
