Skip to main content
“更新变量”和“执行条件”都需要填写值。当前编辑器提供两种写法:宏嵌入文本动态表达式。两者的结果类型不同,不能只看起来相似就互换。

先选对值的类型

例如,指令参数“内容”的引用方式是 $内容
需要把一个参数原样写入变量时,优先使用动态表达式 $参数名。需要把多个值整理成一句话时,再使用宏嵌入文本。

宏嵌入文本

宏嵌入文本会保留你输入的普通文字,并替换其中的 {{…}} 完整示例:
宏嵌入文本始终得到字符串。输入 true 得到的是文字 "true",不是布尔值;输入 [] 得到的是文字 "[]",不是数组。
指令参数必须带 $:写 {{$内容}},不是 {{内容}}。页面代码也不使用这套宏读取普通变量;页面代码直接写 frame.textstate.player_name

动态表达式

动态表达式使用 JavaScript 表达式计算一个值。它可以直接读取:
  • state.x:State 变量;
  • frame.x:当前 Frame 字段;
  • $参数名:当前“解析指令”规则的具名参数;
  • MathJSONArrayObjectStringNumberBooleanDateRegExp 等安全内置对象。
常用示例: 表达式只有一行时直接填写结果表达式,不写 return。对象字面量外层加圆括号,避免被解释成代码块。 虽然运行时也能把部分裸名称先按 State、再按 Frame 查找,例如 affection + 1,文档示例统一写完整的 state.affectionframe.speaker,避免同名字段造成歧义。

在表达式中读取页面输入

输入引用仍写在双花括号中。运行时会先把它替换成字符串,再计算表达式:
页面输入默认是字符串。参与加减前使用 Number(),否则 "8" + 1 会得到 "81"

指令参数怎样进入规则

选择“解析指令”后,触发条件区域会列出每个参数的引用方式。例如指令“台词”定义:
  • 单行参数:角色背景立绘
  • 跨行参数:内容
规则中对应使用:
参数名是引用契约。名称应使用中文、英文字母、数字或下划线,不能以数字开头,也不要包含空格、标点或 $。同一指令内不能重名。 修改参数名后,旧规则中的 $旧名称 不会自动变成 $新名称

四种变量操作

变量目标必须以 frame.state. 开头。

set

设置文字:
设置数组:

append

把同一帧中的多条“选项”指令保存成数组:
目标已经存在但不是数组时,append 不会执行。先在“进入帧”规则中把瞬态列表设为 [],再追加内容。

merge

把部分字段合并进对象:
merge 只合并对象的第一层,不会递归合并内部对象。

remove

从数组删除一个基本值:
从对象数组删除匹配项:
对象匹配是第一层字段比较。上例会删除所有 id 等于 1 的项目。

不要直接写数组下标路径

不要把目标写成 state.items[0].done。当前规则写入器不把数组下标当作可编辑路径。需要修改数组内部某项时,使用 set 替换整个数组:

从页面元素读取值

“用户交互”规则先用 Element Selector 找到触发元素,再按值中的输入引用采集内容。 例如页面代码提供:
点击规则的 Element Selector 填 .story-choice,触发 AI 回复的“自定义用户输入”填:
这样显示文案和发送给 AI 的自然语言行动可以分别维护。

执行条件

“+ 执行条件”只控制它所在的那一个动作。条件左侧虽然标为“变量名”,实际可以填写变量或表达式;右侧仍可选择“宏嵌入文本”或“动态表达式”。 布尔值和数字比较时,右侧使用动态表达式:
如果右侧改成宏嵌入文本 true,比较的是字符串,不是布尔值。

动作顺序

一条规则中的动作从上到下执行,后面的表达式可以读取前面刚写入的值。例如:
  1. 更新 state.selected_route
  2. 跳转到目标页面节点;
  3. 触发 AI 回复。
“触发 AI 回复”在同一规则中至多一次,并且必须是最后一个动作。

快速排错

MoMo:先问结果要的是字符串、数字、数组还是对象。类型确定后,再选“宏嵌入文本”或“动态表达式”。