变量 · 函数 · 数据类型
世界逻辑规则通过变量记住并计算值,用于分数、剩余尝试次数、任务阶段等。函数是多条规则共用的动作集合。enum 和数据类型将值组织成固定的形式。
| 功能 | 作用 | 使用的 type |
|---|---|---|
| 变量 | 记住值。 | 动作「设置变量」(set_var)· 条件「比较」(compare)· 表达式 {名称} |
| 函数 | 只有被其他动作调用时才执行的规则。 | 触发器「函数」(function)· 5 种调用动作 |
| enum | 只能取固定值之一的类型。 | 变量、数据类型字段的类型 |
| 数据类型 | 由多个字段组成的类型(类似于类)。 | 变量的类型 |
| 内容 | 位置 |
|---|---|
| 变量 · enum · 数据类型窗口 | 世界逻辑面板左上角的「变量」按钮 |
| 设置变量 · 比较 · 函数 type | 世界逻辑面板「添加动作」·「添加条件」· 触发器 type 菜单中的「变量 · 函数」分组,或逻辑图的添加节点窗口 |
为每位玩家计分,达到 10 分时显示标题。
- 点击世界逻辑面板中的「变量」。
- 在「变量」选项卡中点击「添加变量」。
- 设置名称
score、类型int、范围「玩家」、初始值0。 - 点击「应用」(Ctrl+Z 一步即可撤销)。
- 在给分的规则中添加动作「设置变量」。设置变量
score、计算add、值1。 - 在同一规则中添加动作「分支(如果)」。设置左侧
{score}、比较>=、右侧10。 - 在逻辑图中,将「若为真」行的黄色引脚放到空白处。会生成新的「函数」规则(
func_1)。 - 在该函数规则中添加动作「屏幕标题」。
「变量」选项卡中的一行即为一个变量。
| 字段 | 含义 |
|---|---|
| 名称 | 在表达式中写作 {名称}。 |
| 类型 | 基本类型 · enum · 数据类型之一 |
| 范围 | 全局(每个场景一个值)· 玩家(每人一个值) |
| 初始值 | 留空时为该类型的零值。 |
| 类型 | 值示例 | 初始值(留空时) |
|---|---|---|
bool | true · false | false |
int | 3 | 0 |
float | 2.5 | 0 |
string | 你好 | 空文本 |
player | 玩家名称 | 空文本 |
actor | Actor id | 空文本 |
position | x y z(以空格分隔) | 0 0 0 |
| enum | 该 enum 的一个值 | 第一个值 |
| 数据类型 | 每个字段的值(见下文) | 每个字段的初始值 |
所有值都以文本形式保存。数字保留到小数点后第三位。
未声明的名称也可以使用,该名称会成为全局文本变量。它与条件「标志」、动作「设置标志」使用同一存储。需要类型、玩家范围或初始值时再进行声明。
值字段(「设置变量」的值、「比较」的左侧 · 右侧等)中填写表达式。
- 将
{名称}替换为其值。 - 如果剩余文本只包含数字和
+-*/%(),则进行计算(例如{score} * 2 + 1)。 - 否则直接使用替换后的文本(例如
{player} 欢迎光临)。
- 除以 0 的结果为 0。
- 未知的名称会变为空文本。
名称的查找顺序为:局部变量(函数参数 · {index})→ 玩家变量 → 全局变量 → 特殊名称。
| 特殊名称 | 值 |
|---|---|
{player} | 触发者的名称 |
{player_x} · {player_y} · {player_z} | 触发者的位置 |
{player_pos} | 触发者的位置 x y z |
{time} | 场景开始后经过的秒数 |
{random} | 0~1 之间的随机数 |
{index} | 在「重复」中的当前序号(0, 1, 2 …) |
动作「设置变量」(set_var)的字段。
| 字段 | 值 | 含义 |
|---|---|---|
| 变量 | 名称 | 若为数据类型变量,需写到字段,如 hero.hp。 |
| 范围 | auto · global · player · local | auto = 按声明。没有声明时,若存在同名局部变量则为局部,否则为全局。local = 仅在本次执行内 |
| 计算 | 见下表 | |
| 数值 | 表达式 |
| 计算 | 含义 |
|---|---|
set | 改为该值。 |
add · sub · mul · div · mod | 加 · 减 · 乘 · 除 · 取余。除以 0 结果为 0。 |
min · max | 与当前值比较,取较小 · 较大者 |
append | 在末尾追加文本。 |
toggle | 在 true ↔ false 之间切换(不使用值)。 |
当前值不是数字时,在数字计算中视为 0。
条件「比较」(compare)和动作「分支(如果)」通过左侧 · 比较 · 右侧字段进行比较。
| 比较 | 含义 |
|---|---|
== · != | 两者都是数字时按数字比较,否则按文本比较(区分大小写)。 |
< · <= · > · >= | 只比较数字。不是数字时为假。 |
contains | 左侧文本包含右侧文本 |
starts_with | 左侧文本以右侧文本开头 |
函数是触发器为「函数」的规则。它不会自行发生,只有被调用动作按名称调用时才会执行。
| 「函数」触发器字段 | 含义 |
|---|---|
| 函数名 | 调用时使用的名称。 |
| 参数名 | 以逗号分隔的名称(例如 amount, target)。调用时传入的值会成为局部变量 {amount}。 |
- 函数继承调用方的触发者。
- 函数规则的条件为假时,只跳过该函数。
- 函数规则不使用过滤(仅一次 · 冷却 · 权限)。
| 动作 | type | 字段 | 作用 |
|---|---|---|---|
| 调用函数 | call | 函数 · 参数(名称=表达式, …) | 执行函数,结束后执行下一个动作 |
| 依次(序列) | sequence | 函数(逗号分隔) | 依次执行多个函数。前一个函数结束后才执行下一个 |
| 分支(如果) | branch | 左 · 比较 · 右 · 若为真 · 若为假 | 比较后调用一个函数。对应的一侧为空时什么也不做 |
| 重复 | repeat | 次数(1~100)· 函数 | 按次数依次执行函数。{index} = 0, 1, 2 … |
| 每个玩家 | for_each_player | 接收者 · 函数 | 对每个接收者,以其为触发者依次执行函数 |
- 被调用的函数遇到「等待」时,调用方也会一同等待。函数结束后才进入下一个动作。
- 函数调用函数的深度最多为 16。超过时会中断并记录错误(递归循环)。
- 参数表达式在调用时计算。
自 0.9.11 起:一个调用字段中只能写一个函数。写入多个函数会产生检查错误。要依次调用,请使用「依次(序列)」。存在两条以上同名函数规则时同样会产生检查错误。
函数与信号的区别
Section titled “函数与信号的区别”| 函数 | 信号 | |
|---|---|---|
| 调用动作 | 调用函数 · 依次 · 分支 · 重复 · 每个玩家 | 发送信号 |
| 接收方 | 该名称的一条「函数」规则 | 该名称的所有「收到信号时」规则(广播) |
| 等待 | 等待函数结束(包括 wait) | 不等待 |
| 图 | 黄色函数引脚 — 一个引脚一条线 | 信号引脚 — 连线到所有接收规则 |
自 0.9.11 起:「变量」窗口改为三个选项卡(变量 · enum · 数据类型)。
在「enum」选项卡中点击「添加 enum」。
| 字段 | 示例 |
|---|---|
| 名称 | Job |
| 值(以逗号分隔) | warrior, mage, archer |
- 可以作为变量、数据类型字段的类型选择。
- 该类型变量的初始值为指定的初始值,没有时为第一个值。
- enum 范围以外的初始值或「设置变量」值会产生检查注意。
在「数据类型」选项卡中点击「添加数据类型」,然后用「添加字段」添加字段。
| 字段 | 示例 |
|---|---|
| 数据类型名称 | Hero |
| 字段名称 · 字段类型 · 初始值 | hp · int · 20 / job · Job / gold · int |
字段类型可以是基本类型、enum 或其他数据类型。
数据类型变量按字段展开为各自的值。变量 hero(类型 Hero)的写法如下。
| 使用位置 | 示例 |
|---|---|
| 表达式 | {hero.hp} · {hero.job} |
| 「设置变量」的变量字段 | hero.hp |
| 「比较」的左侧 | {hero.job} |
| 嵌套数据类型 | {hero.stats.str} |
- 范围遵循变量声明。
- 对整个
hero执行「设置变量」会产生检查错误。请选择字段。 - 数据类型变量的初始值按字段(在数据类型选项卡中)设置。变量行中的初始值不会被使用。
点击「应用」时进行检查,并以通知显示问题。
| 类型 | 内容 |
|---|---|
| 错误 | 名称规则(以英文字母开头,仅限英文字母 · 数字 · _)· 名称重复(基本类型 · enum · 数据类型之间)· 没有值的 enum · 没有字段的数据类型 · 不存在的类型 · 包含自身的数据类型(循环)· 对整个数据类型执行「设置变量」· 重复的变量声明 |
| 注意 | enum 范围以外的初始值 · enum 范围以外的「设置变量」值 · 数据类型变量行的初始值 |
函数方面的检查如下。
| 类型 | 内容 |
|---|---|
| 错误 | 不存在的函数名 · 同名的函数规则 · 一个调用字段中有多个函数 |
| 注意 | 没有调用动作的函数 · 函数规则中开启的过滤 |
「世界逻辑 变量 · enum · 数据类型」窗口中的按钮。
| 按钮 | 作用 |
|---|---|
| 添加变量 · 添加 enum · 添加数据类型 | 添加新行。 |
| 添加字段 | 为数据类型添加字段。 |
| 移除(回收站) | 移除该行 · 字段。 |
| 应用 | 一次性保存三个选项卡。撤销时为一步。 |
| 关闭 | 不保存直接关闭。 |
| 键 | 动作 |
|---|---|
| Esc | 关闭窗口(丢弃未应用的内容) |
| Ctrl+Z | 撤销「应用」 |
提示 / 注意
Section titled “提示 / 注意”- 点击「应用」之前不会保存任何内容。
- 运行中的变量值可以在运行的世界逻辑历史(「变量名 = 值」行)中查看。
- 服务器插件也必须按相同规则执行变量和函数。服务器端的支持情况请确认服务器插件的版本。
- 在服务器上,数据类型变量以展开后的名称(
hero.hp等)保存。