Skip to content

行为与自动化

平台上大多数世界根本不用规则。排名第一的世界(大逃杀)一条也没有。只有约 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-abovedrops-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-timercancel-timer)在编辑器中可见,但计时器运行时尚未启用。你可以在设计中使用它们,但在当前版本中计时器不会在游戏过程中倒计时。这项功能正在积极开发中。


条件:ONLY IF 检查

规则使用与条目相同的条件系统——相同的 7 种运算符(eqneqgtgteltltecontains),相同的 All/Any 组合逻辑。完整的运算符参考请参阅写好条目的技巧:状态驱动条目

如果条件留空,规则每次触发器匹配时都会执行。


动作类型:规则能做什么

条件通过后,引擎按顺序执行动作。单条规则可以有多个动作——这就是规则强大的地方。

修改变量

直接修改游戏状态变量。九种操作:setaddsubtractmultiplytoggleappendmergepushdelete

最常用的:set(覆盖值)、add/subtract(增减数值)和 toggle(翻转布尔值)。

注入指令

向 AI 的 prompt 添加临时指令。这可以说是最强大的动作,因为它改变了 AI 被告知要做什么,从而改变整个叙事方向。

你给它一个唯一 ID(这样以后可以移除)、指令文本,以及放在 prompt 中的位置(topbefore_charafter_charbottomdepthauto)。

默认情况下,注入的指令跨回合持续(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(匹配你音频设置中的曲目)、一个 actionplaystopcrossfadevolume),以及可选的 volumefadeDuration 设置。


已发布世界中的真实模式

好感度阈值(樱花季)

经典用例。樱花季有 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