Skip to content

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 / repeat
  • once / hold
  • pingpong

2. Molang 条件如何写

Graph 的 conditionMolang 表达式,在客户端执行:

  • v.xxx:来自服务端 vars/flags
  • query.xxx:实体查询

示例:

  • v.speed > 0.2
  • query.is_on_ground == 1
  • v.skill_attack == 1

3. RootMotion 与 Graph 的关系

  • state.rootMotion: true/false 用于是否输出 RootMotion
  • clips 段只供 服务端 RootMotion 计算使用(必须写 length)。

服务端 RootMotion 使用 vars.statevars.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: disabled

5. 常见问题

  • Graph 生效但没动画clip 名称不匹配模型中的动画名称。
  • 转场不触发:Molang 写错 / 变量未同步 / 条件恒为 false。
  • RootMotion 不动applyRootMotion 未开启 / clip 未配置 length