数学函数
下面这段可以直接复制到页面 yml。它会在页面打开时处理价格和生命比例,并把结果发到玩家聊天栏:
yaml
vars:
price: 1.236
health: 17
maxHealth: 20
events:
open: |-
vars.price = round(vars.price, 2)
vars.priceText = fixed(vars.price, 2)
vars.healthRatio = clamp(vars.health / max(vars.maxHealth, 1), 0, 1)
log("价格:{vars.priceText},生命比例:{vars.healthRatio}")round(1.2, 2) 得到的是数字 1.2,适合继续加减乘除;fixed(1.2, 2) 得到的是文字 "1.20",适合显示固定小数位。需要计算就用 round,需要展示金额、百分比等固定格式就用 fixed。
函数表
| 英文 | 中文 | 参数 | 返回值 | 说明 |
|---|---|---|---|---|
trunc(value) | 取整 | 1 | 数字 | 向 0 取整,trunc(-1.8) 为 -1 |
round(value[, digits]) | 四舍五入 | 1 或 2 | 数字 | HALF_UP 四舍五入,位数默认 0 |
floor(value) | 向下取整 | 1 | 数字 | 向负无穷取整,floor(-1.2) 为 -2 |
ceil(value) | 向上取整 | 1 | 数字 | 向正无穷取整,ceil(-1.2) 为 -1 |
fixed(value, digits) | 保留小数 | 2 | 文字 | HALF_UP,保留末尾的 0 |
abs(value) | 绝对值 | 1 | 数字 | 返回绝对值 |
sign(value) | 符号 | 1 | 数字 | 返回 -1、0 或 1 |
min(a, ...) | 最小值 | 1 至 32 | 数字 | 返回最小参数 |
max(a, ...) | 最大值 | 1 至 32 | 数字 | 返回最大参数 |
clamp(value, min, max) | 限制范围 | 3 | 数字 | 把数值限制在闭区间内 |
pow(value, power) | 次方 | 2 | 数字 | 幂运算 |
sqrt(value) | 平方根 | 1 | 数字 | 参数不能小于 0 |
lerp(start, end, ratio) | 插值 | 3 | 数字 | 按比例插值,比例可以超出 0 到 1 |
map(value, inMin, inMax, outMin, outMax) | 映射范围 | 5 | 数字 | 映射区间,不会自动裁剪结果 |
sin(value) | 正弦 | 1 | 数字 | 参数使用弧度 |
cos(value) | 余弦 | 1 | 数字 | 参数使用弧度 |
tan(value) | 正切 | 1 | 数字 | 参数使用弧度 |
atan2(y, x) | 方向角 | 2 | 数字 | 返回弧度角 |
radians(degrees) | 转弧度 | 1 | 数字 | 角度转弧度 |
degrees(radians) | 转角度 | 1 | 数字 | 弧度转角度 |
random() / random(min, max) | 随机数 | 0 或 2 | 数字 | 返回 [0,1) 或 [min,max);两端相等时返回该值 |
randomInt(min, max) | 随机整数 | 2 | 数字 | 返回包含两端的安全整数 |
round 和 fixed 的 digits 只能是 0 至 12 的整数。三角函数都使用弧度;例如先写 sin(radians(30)),结果约为 0.5。map 只换算区间,不会把超出输入区间的值裁掉;需要裁剪时再套一层 clamp。
响应式进度条
text
component("health_bar").layout.width = formula(
lerp(0, 200, clamp(vars.health / max(vars.maxHealth, 1), 0, 1))
)formula(...) 保存的是原始公式,所以之后修改 vars.health,进度条仍会重新计算。若去掉 formula,普通 = 只保存脚本执行当时算出的数字。
随机数只能写在执行型脚本中
text
vars.dice = randomInt(1, 6)随机函数可以写在事件、方法和计时器回调中。布局公式、formula(...)、visibleWhen、enabledWhen 和响应式文字 {...} 都会拒绝随机函数,避免每次渲染时不停变化。
randomInt 的两端必须是 -9007199254740991 到 9007199254740991 内的整数,并且最小值不能大于最大值。
写错时会怎样
| 位置 | 非法参数、未知函数、非有限结果或定义域错误 |
|---|---|
| 事件、方法、计时器脚本 | 跳过当前错误语句,后续语句继续执行 |
| 布局公式 | 保存和新绑定时拒绝;运行时旧数据失败时保留最后一次有限值,首次失败使用 0 |
visibleWhen / enabledWhen | 保存时拒绝;运行时遇到旧的非法条件按 false 处理 |
响应式文字 {...} | 保留原占位内容,页面不会崩溃 |
常见错误包括:round() 参数不足、fixed(1, 2, 3) 参数过多、sqrt(-1)、map 输入区间两端相等、clamp 最小值大于最大值,以及任何 NaN 或无限结果。
猹件开发组