过场场景数据
使用完整的过场场景 JSON 格式定义镜头轨道、角色指令、世界事件与字幕。
过场场景是由服务器加载的时间轴,组合镜头运动、角色指令、世界事件与字幕。位置相对于传入的枢轴,因此同一场景可以在不同地点播放,无须重写坐标。
文件放在哪里
场景 JSON 放在 data/<namespace>/cinematic_scenes/*.json,可包含子目录。默认由资源路径形成场景 ID;显式 id 可覆盖它。高优先级数据包替换同一资源 ID。不同文件若声明相同场景 ID,加载器会记录冲突,但此时后项已替换前项,且资源遍历没有排序。
纯镜头 Gecko 动画属于独立的客户端资源,放在 assets/<namespace>/camera_animations/*.json。场景的 gecko 轨道引用动画注册 ID,而不是 JSON 文件名。原生 spline 轨道不需要这种资源。
最小示例
这个短暂的固定镜头使用与内置 isekaiexpansion:hidden_hud_subtitle_scene 相同的镜头节点字段。保存为 data/example/cinematic_scenes/fixed_shot.json 后,场景 ID 为 example:fixed_shot;以每秒 20 刻计,40 刻为 2 秒。
{
"schema": 1,
"length_ticks": 40,
"camera": {
"track": {
"nodes": [
{ "t": 0, "pos": [0, 1.7, 4], "rot": [0, 180, 0], "fov": 60 }
]
}
}
}
空对象也能解析,但不提供镜头姿态。它仍有默认播放设置,因此加载成功不代表镜头内容可用。
字段
根对象与播放设置
| 字段 | 类型 | 默认值 | 含义与限制 |
|---|---|---|---|
schema | integer | 1 | 保存的版本号;加载器不会拒绝其他整数。 |
id | string | 文件资源 ID | 覆盖查询 ID,必须是资源标识符。 |
length_ticks | integer | duration,再默认 160 | 场景时长,单位刻,至少为 1。 |
duration | integer | 160 | 旧的时长别名;length_ticks 优先,但提供此字段时仍会解析。 |
playback | object | 见下表 | HUD、输入、混合与淡入淡出设置。 |
pivot | object | 见下表 | 仅作元数据;运行时使用触发器或调用方提供的变换。 |
actors | object | 触发玩家 | 角色键映射;缺少 player 时自动补入。 |
camera | object | 空轨道与效果 | 包含 track 与 effects。 |
actor_tracks | object | 空 | 角色键 → 指令数组。 |
events | array<object> | 空 | 服务器世界事件。 |
subtitles | array<object> | 空 | 客户端字幕指令。 |
| 字段 | 类型 | 默认值 | 含义与限制 |
|---|---|---|---|
hide_hud | boolean | true | 隐藏普通 HUD;字幕使用独立覆盖层。 |
lock_input | boolean | true | 锁定过场输入,播放期间关闭其他客户端界面。 |
lock_movement | boolean | true | 限制观众移动,场景驱动的本地玩家步行除外。 |
allow_esc_skip | boolean | false | 允许观众申请跳过,需要所有当前观众投票。 |
fade_in_ticks | integer | 10 | 入场淡入淡出时长,单位刻;正值会延迟本地播放,并推进起播时间。 |
fade_out_ticks | integer | 10 | 离场淡入淡出时长,单位刻。 |
blend_in_ticks | integer | fade_in_ticks | 有 playback 对象时默认使用入场淡入淡出时长;整个对象省略时,混合默认值为 8。 |
blend_out_ticks | integer | fade_out_ticks | 有 playback 对象时默认使用离场淡入淡出时长;整个对象省略时,混合默认值为 8。 |
pivot.source | string | trigger | 空白恢复为 trigger;保存但不据此选择枢轴。 |
pivot.space | string | local_yaw | 空白恢复为 local_yaw;不会开启其他世界坐标模式。 |
所有场景时间均以刻为单位。总时长会钳制,但不会检查指令时间是否超过总时长;结束后的条目不会执行。播放淡入淡出与混合数值没有解析范围检查,客户端传输会将负值规范化为 0。省略 playback 时混合值为 8;提供空对象时为 10,因为缺失的混合字段会继承淡入淡出值。
枢轴坐标与角色
传入变换的参考姿态中,+X 向右、+Y 向上、−Z 向前。局部偏航 180 表示向前。位置偏移按枢轴偏航减 180 旋转;世界偏航等于枢轴偏航加局部偏航再减 180。位置使用方块单位,旋转使用度。pivot 元数据不会选择或移动实际变换。
| 字段 | 类型 | 默认值 | 含义与限制 |
|---|---|---|---|
<actor-key> | object | 无自定义角色 | 去除两端空白,最多 64 字符;保留字母、数字、下划线、连字符、点和冒号。其他字符替换为连续折叠的下划线;空键变成 player。 |
selector | string | player 为 triggering_player;其他为 nearest | triggering_player、nearest、nearest_type。未知值回退为 nearest。 |
entity_type | string | 无 | 可选实体类型 ID,约束最近实体搜索。 |
radius | number | 16 | 搜索盒半边长,单位方块;解析目标时至少为 1。自动补入的玩家角色使用 0,并跳过搜索。 |
name | string | 无 | 最近实体搜索要求显示名称精确匹配。 |
uuid | string | 无 | 有效 UUID;找到活体实体后优先使用,不再检查最近搜索的筛选条件。 |
triggering_player 直接选择玩家,先于 UUID 与其他筛选。否则,UUID 找到的活体实体优先;找不到时继续最近实体搜索。两种最近选择器都使用轴对齐搜索盒及可选的类型和名称筛选,再从存活且未移除的候选者中选择离枢轴最近者。搜索盒不是球形半径检查。显式类型筛选会将触发玩家排除在该搜索之外。
规范化后相同的角色键会由后项覆盖前项。显式提供的 player 定义会保留,只有缺失时才补入默认触发玩家定义。播放开始时,无法解析的自定义角色会被省略。
镜头轨道与节点
第一张表描述 camera 及其中的 track,第二张表描述每个 track.nodes 条目。
| 字段 | 类型 | 默认值 | 含义与限制 |
|---|---|---|---|
track | object | 空 spline | camera 中的镜头轨道。 |
effects | array<object> | 空 | camera 中按时间触发的屏幕效果。 |
type | string | 有 animation 时为 gecko,否则为 spline | spline 或 gecko;未知值变成 spline。 |
interpolation | string | catmull_rom | catmull_rom 或 linear;未知值变成 catmull_rom。 |
animation | string | 无 | gecko 轨道使用的动画注册 ID;缺失或找不到时不产生镜头姿态。 |
nodes | array<object> | 空 | 按时间排序的样条关键帧。空数组不产生姿态,单节点为固定姿态。 |
| 字段 | 类型 | 默认值 | 含义与限制 |
|---|---|---|---|
t | integer | time,再默认 0 | 时间位置,单位刻,非负;存在 t 时不读取 time。 |
time | integer | 0 | 仅在 t 缺失时使用的别名。 |
pos | array<number> | [0, 0, 0] | 恰好 3 个局部方块坐标:x、y、z。 |
rot | array<number> | [0, 180, 0] | 恰好 3 个角度值:俯仰、偏航、翻滚。另见下方目标与旋转限制。 |
fov | number | 无 | 单位度,解析器不钳制范围。两端都缺失时保留基础视场角;只提供一端时,该段使用该值。 |
look_at | target | 无 | 解析成功的目标覆盖俯仰与偏航;找不到目标时保留制作的旋转。 |
ease | string | linear | 以此节点为终点的区段使用此缓动。 |
原生轨道按所选方式插值位置,线性插值俯仰,并按环绕角度插值偏航与翻滚。终点节点提供缓动。终点观察目标优先于前一节点的目标,不会在两个角色目标之间混合。
场景传输会重建镜头 JSON。节点有 look_at 时,只写入该目标而省略 rot,客户端因此重新解析出默认旋转。正常服务器播放中,不应依赖带目标节点所制作的翻滚或回退旋转能够保留。没有目标的节点保留旋转。
Gecko 轨道按每秒 20 刻换算场景已过时间,并限制到动画长度。此路径不使用纯镜头 API 的循环或保持选择。缺少动画数据时不产生姿态。
目标
look_at 与 face 接受下列字段组成的对象、含 3 个数字的局部位置数组,或字符串 walk_target。其他字符串不产生目标,null 也表示无目标。
| 字段 | 类型 | 默认值 | 含义与限制 |
|---|---|---|---|
actor | string | 无 | 角色键目标,先取脚部位置再加偏移。 |
pos | array<number> | 无 | 没有角色或移动终点目标时使用,恰好 3 个局部坐标。 |
offset | array<number> | [0, 0, 0] | 恰好 3 个局部偏移;围绕枢轴旋转后相加。 |
walk_target | boolean | false | true 优先选择移动终点,再考虑 actor 或 pos。 |
target | string | 空 | 此处唯一特殊字符串值为 walk_target。 |
对象优先级依次为移动终点、角色、位置。角色目标使用脚部位置,拍摄面部时应增加向上的偏移。walk_target 对角色指令有意义;镜头节点没有对应移动指令提供终点,因此无法解析它。直接数据解析器不规范化目标角色字符串,而编辑器与客户端传输会规范化;各处应使用同一个已经规范化的键。
镜头效果
| 字段 | 类型 | 默认值 | 含义与限制 |
|---|---|---|---|
t / time | integer | 0 | 共用非负时间刻与别名规则。 |
type | string | shake | shake 或 distortion;未知值变成 shake。 |
duration | integer | 20 | 单位刻,至少 1。 |
strength | number | 1 | 震动像素强度钳制为 0–48;扭曲强度钳制为 0–1。低于或等于 0.001 时不启动效果。 |
frequency | number | 14 | 震动频率钳制为 0.1–60;扭曲直接传给着色器。 |
damping | number | 2.2 | 震动衰减指数,钳制为 0.1–8;扭曲不使用。 |
speed | number | 1 | 扭曲着色器时间倍率;震动不使用。 |
多个震动实例合并,最终受强度上限约束;新的扭曲替换当前扭曲。它们是客户端屏幕效果,不改变角色位置。中途加入的观众只播放已开始效果的剩余部分,不会从头重播完整时长。
角色轨道
| 字段 | 类型 | 默认值 | 含义与限制 |
|---|---|---|---|
<actor-key> | array<object> | 无轨道 | 按角色键规则规范化;没有已解析角色时跳过轨道。 |
t / time | integer | 0 | 共用非负时间刻与别名规则。 |
type | string | pose | pose、move_path、teleport、emoji、npc_body_emote、animation;未知值变成 pose。 |
duration | integer | 0 | 至少 0 刻。移动需要正时长;其他指令类型的含义见下文。 |
mode | string | 缺省时为 walk | grounded、walk、sprint、teleport_interpolated、navigation。未知或空白值回退为 grounded,而不是 walk。 |
pos | array<number> | 无 | 恰好 3 个局部坐标;姿态指令省略时保留当前位置。 |
yaw | number | 无 | 局部偏航角,单位度;缺省使用当前朝向或移动及面向逻辑。 |
points | array<array<number>> | 空 | 路径点,每个恰好 3 个坐标;路径采样时优先于 pos。 |
face | target | 无 | 面向目标;walk_target 指向本指令的最后路径点或 pos。 |
id | string | 无 | 按类型解释为表情、NPC 肢体表情或玩家及 NPC 动画 ID。 |
force | boolean | true | 切换表情 FORCE 与 REPLACE 策略,不是通用的强制移动开关。 |
speed | number | 1 | 步行或冲刺的标准速度倍率,钳制为 0.25–4;寻路至少使用 0.05。 |
ease | string | linear | 用于插值移动,不控制步行或冲刺的步态速度。 |
| 指令或模式 | 播放行为 |
|---|---|
pose / teleport | 服务器进行离散的位置与偏航变更。默认 walk 模式,以及显式 grounded、sprint 模式,会将姿态贴合附近地面。 |
move_path 配合 walk / sprint | 感知碰撞的行走。非玩家角色在服务器移动,每位玩家角色通过自己的客户端移动输入行走。 |
move_path 配合 navigation | 可寻路角色向终点发起寻路;其他角色使用插值放置。 |
move_path 配合 grounded / teleport_interpolated | 服务器沿制作的路径插值;grounded 不会为每次插值移动额外执行感知碰撞的贴地处理。 |
emoji | 按制作的正时长播放指定贴纸,否则使用表情系统默认时长。 |
npc_body_emote | 在支持的 NPC 上强制播放肢体表情,不是通用玩家动画。 |
animation | 服务器播放 NPC 忙碌动画,客户端播放已注册玩家动画。对玩家而言,duration 控制入场混合,钳制为 0–10 刻,不控制片段长度。 |
步行或冲刺需要非零长度的路径。单个路径点或只有 pos,不会自动构成从角色当前位置出发的步行路线。移动不会把偏离路径的角色瞬移到首点;确实需要这种切换时,应显式使用姿态指令。
| 步态规则 | 数值 |
|---|---|
| 标准步行速度 | 每刻 0.2160 方块 |
| 标准冲刺速度 | 每刻 0.2808 方块 |
| 制作速度倍率 | 0.25–4 |
| 接受的时间速度范围 | 缩放后标准速度的 0.80–1.25 倍 |
路径长度除以时长得到请求速度;超出范围时会钳制,并由加载器记录时间警告。此修正不会延长指令窗口或场景时长。角色受阻、偏离路径起步或时长过短,仍可能无法抵达终点。
正时长移动指令从起始刻执行到起始刻加时长,包含两端。重叠指令不会被拒绝或合并,应避免让同一角色同时接受互相竞争的移动指令。缺少角色或动画 ID 时跳过对应动作,不会因此拒绝整个场景。
世界事件
| 字段 | 类型 | 默认值 | 含义与限制 |
|---|---|---|---|
t / time | integer | 0 | 共用非负时间刻与别名规则。 |
type | string | sound | sound、effek、particle、weather、time;未知值变成 sound。 |
id | string | 无 | 声音、Effek 或粒子资源 ID;对应类型缺少它时不执行。 |
pos | array<number> | 枢轴 | 位置事件使用,恰好 3 个局部坐标。 |
volume | number | 1 | 声音音量,直接传递。 |
pitch | number | 1 | 声音音调,直接传递。 |
scale | number | 1 | Effek 缩放。 |
duration | integer | 20 | 至少 1 刻;用于天气,不用于终止声音或 Effek 实例。 |
category | string | players | 声音分类,不区分大小写;未知或空白值回退为 players。 |
weather | string | 执行时默认 clear | rain、thunder、storm;其他值均为晴天。影响整个场景世界。 |
time_of_day | integer | -1 | 世界时间值;负数不执行。 |
count | integer | 1 | 粒子数量,至少 1。 |
spread | array<number> | [0, 0, 0] | 恰好 3 个世界轴向的粒子散布值,不随枢轴旋转。 |
speed | number | 0 | 粒子速度参数。 |
visible_to_all | boolean | true | 仅传给 Effek 广播辅助方法,不是通用事件观众筛选。 |
事件在服务器到时后执行一次。声音与粒子通过世界广播;天气和时间改变整个世界,而非只改变观众的画面。粒子事件支持无额外负载的已注册简单粒子类型;方块或物品式粒子的附加参数不属于此格式。
字幕与缓动
| 字段 | 类型 | 默认值 | 含义与限制 |
|---|---|---|---|
t / time | integer | 0 | 共用非负时间刻与别名规则。 |
duration | integer | 40 | 显示时长,单位刻,至少 1。 |
speaker | string | 无 | 可选翻译键或字面文本;空白时隐藏说话者行。 |
text | string | 必填 | 翻译键或字面文本。 |
chars_per_second | number | 48 | 文字显示速度;非正值立即显示整行。 |
color | integer / string | 0(继承主题) | ARGB 整数,或可带 # 的十六进制字符串。不超过 6 位时补不透明 alpha;更长的值转换为 32 位整数。 |
同一时间只有一条字幕,新指令会替换当前字幕。文本与说话者按翻译键解析,也可以直接使用字面文本。普通 HUD 隐藏时,字幕覆盖层仍可显示。中途加入的观众会从尚未过期字幕的已播放位置继续显示文字。
缓动名称为 linear、step、ease_in_quad、ease_out_quad、ease_in_out_quad、ease_in_sine、ease_out_sine、ease_in_out_sine、ease_in_cubic、ease_out_cubic、ease_in_out_cubic、ease_in_back、ease_out_back。输入不区分大小写,去除两端空白,并将连字符或空格转为下划线;也识别 easeInOutQuad 等紧凑名称。未知名称回退为 linear。
校验
| 输入 | 结果 |
|---|---|
| 缺少可选字段 | 使用上表对应字段的默认值 |
| 未知字段 | 忽略,不会开启其他事件或执行模式 |
| 可选对象或数组容器类型错误 | 按缺失处理;这不同于有效数组中的错误条目 |
| 数组条目结构错误、资源 ID 或 UUID 无效、缺少字幕 text、向量不是 3 个元素、标量转换失败 | 拒绝该场景资源;其他场景继续加载 |
| 已知选项字段中的未知值 | 回退到对应选项组的默认值,不是加载错误 |
| 不支持的 schema 整数 | 保存,不拒绝版本,也不迁移 |
| 显式场景 ID 重复 | 替换前项后记录错误;没有稳定的资源顺序优先项 |
| 空根对象 | 接受并使用默认值 |
| JSON 语法错误 | 不产生有效场景 |
| 重载中出现错误 | 新收集的映射替换旧映射,包含部分成功结果;失败的旧场景不会保留 |
解析器不检查数值是否有限,不限制最大时间轴长度或关键帧数量,也不会检查所有引用素材是否存在。应使用有限数值与有效 ID;解析成功不代表角色、动画、声音或粒子实际可用。
正常场景启动传输会发送压缩的制作草稿,接收时限制为 262144 压缩字节,最多发送 64 项角色绑定,每个键最多 64 字符。这是压缩体积限制,不是解压后内存上限。客户端重建会将许多向量、旋转及效果数值舍入到 3 位小数,规范化目标键并丢弃未知字段。时间轴应保持在传输预算内,且不要依赖更细的精度。
重载
/reload 重建服务器场景目录并增加修订号,即使重载存在错误也会如此。启动场景时发送当前定义与已解析角色绑定;原生轨道不要求客户端本地持有服务器数据包。Gecko 镜头动画与其他视觉素材仍须放在客户端资源包中。
正在运行的服务器播放保留启动时的场景对象。重载定义影响后续启动,不改变现有时间轴。检查修改时应重新启动场景;修改镜头动画素材后,还需单独重载客户端资源。