主题
Graph(动画图)
Graph 是动画系统的状态机。它定义:
- 有哪些 Layer
- 每个 Layer 有哪些 State
- State 对应哪个动画 Clip
- State 之间如何转场(Molang 条件)
服务端读取 YAML,转成 JSON 下发到客户端。客户端执行 Molang 与动画混合。
1. Layer / State / Transition 基本结构
- Layer:动画层。支持
OVERRIDE/ADDITIVE。 - State:状态,绑定动画 Clip。
- Transition:转场,使用 Molang 条件。
Loop 取值:
loop/repeatonce/holdpingpong
2. Molang 条件如何写
Graph 的 condition 是 Molang 表达式,在客户端执行:
v.xxx:来自服务端vars/flagsquery.xxx:实体查询
示例:
v.speed > 0.2query.is_on_ground == 1v.skill_attack == 1
3. RootMotion 与 Graph 的关系
state.rootMotion: true/false用于是否输出 RootMotion。clips段只供 服务端 RootMotion 计算使用(必须写length)。
服务端 RootMotion 使用 vars.state 或 vars.state.<layer> 指定状态:
yml
vars:
state: "run" # 全局覆盖
state.base: "run" # 指定层覆盖4. 最小可用示例(人形)
project/runtime-spigot/src/main/resources/animation/graphs/default.yml
yml
"example:humanoid":
layers:
- name: base
weight: 1.0
blend: OVERRIDE
default: idle
- name: upper
weight: 1.0
blend: ADDITIVE
default: idle
states:
- name: idle
layer: base
clip: idle
speed: 1.0
loop: loop
rootMotion: true
- name: run
layer: base
clip: run
speed: 1.0
loop: loop
rootMotion: true
- name: attack
layer: upper
clip: attack
speed: 1.0
loop: once
rootMotion: false
transitions:
- from: idle
to: run
condition: "v.speed > 0.2"
blendTime: 0.2
- from: run
to: idle
condition: "v.speed <= 0.2"
blendTime: 0.2
- from: run
to: attack
condition: "v.skill_attack == 1"
blendTime: 0.1
clips:
idle:
length: 1.0
rootMotion:
mode: disabled
run:
length: 1.0
rootMotion:
mode: velocity
velocity: [0, 0, 1.2]
yawSpeed: 0
attack:
length: 0.6
rootMotion:
mode: disabled5. 常见问题
- Graph 生效但没动画:
clip名称不匹配模型中的动画名称。 - 转场不触发:Molang 写错 / 变量未同步 / 条件恒为 false。
- RootMotion 不动:
applyRootMotion未开启 / clip 未配置length。