mcpField
G
godot-animation-tree-mastery

godot-animation-tree-mastery

github.com/thedivergentai开发907411 次安装2 周前更新
代码仓库

关于 godot-animation-tree-mastery

面向 Godot 开发者的 AnimationTree 技能,涵盖高级动画混合与状态机。它按常见需求提供图形结构建议、参数管理、转换和运行时调试脚本。

主要功能

  1. 01AnimationTree 状态机跳转
  2. 02BlendSpace 与 BlendTree 指引
  3. 03带条件的参数更新
  4. 04嵌套状态机与 IK 模式
  5. 05根运动与事件分发
  6. 06运行时图形调试

适用场景

  1. 01驱动多个玩法状态间的移动动画
  2. 02将战斗叠加层与基础动画混合
  3. 03在动画图旁加入注视或 IK
  4. 04调试混合值和跳转路径

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/thedivergentai/game-dev-agentic-skills --skill godot-animation-tree-mastery

安装后在 Claude Code 中输入/godot-animation-tree-mastery确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
advanced-graph-recipes.md
migration-notes.md
statemachine-and-blendspace.md
scripts/
advanced_transition_masking.gd
animation_complexity_manager.gd
animation_event_dispatcher.gd
blendtree_logic_mixing.gd
dynamic_timescale_control.gd
nested_state_machine.gd
nested_tree_architecture.gd
reactive_oneshot_vfx.gd
root_motion_animtree_sync.gd
runtime_tree_debugging.gd
skeleton_ik_lookat.gd
statemachine_travel_code.gd
sync_group_layering.gd
sync_parameter_manager.gd
tree_travel_manager.gd

详细介绍

精通 AnimationTree

为 Godot 的高级动画混合和状态机提供专家指导。

绝对不要做

  • 使用 AnimationTree 时,绝对不要在 AnimationPlayer 上调用 play()——AnimationTree 控制动画播放器。直接调用 play() 会造成冲突和抖动。请改用 set("parameters/transition_request") 或 travel()。
  • 绝对不要忘记设置 active = true——AnimationTree 默认处于非活动状态。必须设置 $AnimationTree.active = true,动画才会播放。
  • 绝对不要使用绝对路径访问参数——请使用 "parameters/StateMachine/transition_request" 这样的相对路径。这样节点在层级中的位置变动时,代码仍能正常工作。
  • 交互状态中绝对不要让 auto_advance 保持启用——它会导致立即切换。仅在连招或从死亡到重生等自动序列中使用。
  • 绝对不要用 BlendSpace2D 实现 1D 混合——只混合速度?请用 BlendSpace1D。只混合两个状态?请用 Blend2。BlendSpace2D 专用于 X+Y 方向输入(侧移)。
  • 绝对不要不加保护地每帧更新 AnimationTree 参数——无论参数是否变化,每帧都通过 set() 设置参数会导致缓存失效,并可能引起卡顿。请先检查是否相等。
  • 简单逻辑绝对不要使用深层嵌套的 BlendTrees——每一层都会增加 CPU 开销。如果可以通过 StateMachine 或由脚本驱动的简单 Blend2 处理,就用它们来处理。
  • 同步更新参数时,绝对不要忘记处理 await get_tree().process_frame——有时树需要一帧来协调状态,之后的参数变更才能生效。
  • 长过场动画绝对不要依赖 auto_advance——如果动画被中断,auto_advance 可能会让角色进入异常状态。请改用 Method Tracks 来发出状态完成信号。
  • 动画时长差异很大时,绝对不要使用 Sync 组——它会强制其中一个动画以极端速度播放。对于周期不匹配的动画,请使用 TimeScale 或分离图层。

可用脚本

必须:实现相应模式前,请先阅读对应脚本。 除非工作涉及嵌套战斗图、IK 注视目标或深层 BlendTree 分层,否则不要加载 references/advanced-graph-recipes.md。

sync_parameter_manager.gd

为 AnimationTree 参数写入添加保护——防止每个物理帧都重复调用 set()。

statemachine_travel_code.gd

通过 travel() / start() 以编程方式控制 AnimationNodeStateMachinePlayback。

tree_travel_manager.gd

触发条件:多状态机跳转 / 请求队列。 集中管理跨嵌套播放路径的跳转请求,不调用 AnimationPlayer.play()。

nested_state_machine.gd

触发条件:移动 + 战斗(或空中)子状态机。 嵌套 StateMachine 参数路径与播放权交接。

skeleton_ik_lookat.gd

触发条件:与树并列的瞄准 / 注视目标。 与树所控制的骨骼轨道不发生冲突的 LookAtModifier3D / IK。

reactive_oneshot_vfx.gd

使用 AnimationNodeOneShot 实现后坐力、眨眼和受击反应。

dynamic_timescale_control.gd

运行时调整播放速度,实现子弹时间或加速倍率。

advanced_transition_masking.gd

在 Add2/Blend2 上使用骨骼过滤蒙版,实现上半身 / 下半身分离。

blendtree_logic_mixing.gd

在 BlendTree 图中混合交互式战斗图层。

root_motion_animtree_sync.gd

从 AnimationTree 根运动中提取 CharacterBody 的运动。

sync_group_layering.gd

用于共享时长的多层动画片段的同步组(例如,行走 + 装填)。

nested_tree_architecture.gd

分层状态机 / 嵌套参数路径架构。

runtime_tree_debugging.gd

在运行时可视化当前状态、跳转路径和混合值。

animation_event_dispatcher.gd

方法轨道 → dispatch_event(name, metadata) 信号桥接;将 VFX/音频与图形代码解耦。

animation_complexity_manager.gd

当 VisibleOnScreenNotifier3D 剔除屏幕外的角色时,在英雄版与人群版图形之间切换 tree_root。


决策树(替代内联教程)

需求首选方案脚本
简单的动画片段切换 / UI / 道具仅使用 AnimationPlayerPeer godot-animation-player
5+ 个游戏状态、跳转StateMachine 根节点statemachine_travel_code.gd、tree_travel_manager.gd
仅按速度混合BlendSpace1D通过 sync_parameter_manager.gd 进行带保护的写入
侧移 / 瞄准 X+YBlendSpace2D同上 + blend_position
上半身叠加 / 战斗层BlendTree Add2/Blend2/OneShotblendtree_logic_mixing.gd、reactive_oneshot_vfx.gd
在移动状态下嵌套战斗 / 空中状态嵌套 SM必须使用 nested_state_machine.gd
朝向目标 / IK紧邻图形的修饰器必须使用 skeleton_ik_lookat.gd
深度图形方案references/不要加载,除非确有需要 → advanced-graph-recipes.md

核心概念(精简版): AnimationTree 通过 anim_player 管理 AnimationPlayer;根节点为 StateMachine / BlendTree / BlendSpace;参数使用相对的 "parameters/..." 路径;在 _ready 中将 active = true 设置一次。

@onready var anim_tree: AnimationTree = $AnimationTree
@onready var playback: AnimationNodeStateMachinePlayback = anim_tree.get("parameters/StateMachine/playback")

func _ready() -> void:
    anim_tree.active = true

不要粘贴完整的 StateMachine/BlendSpace 编辑器操作指南——在 AnimationTree 编辑器中创建图形,然后通过上面的脚本驱动它们。


专家见解(原因——保留在正文中)

  • 推进条件与跳转 — 原因:布尔条件会自动触发转换;travel() 用于显式路径跳转。伤害 / 死亡事件使用条件;移动意图使用 travel。
  • BlendSpace2D 的开销 — 原因:八向混合会采样多个动画片段。仅按速度混合时使用 BlendSpace1D;两种状态交叉淡入淡出时使用 Blend2。
  • 参数保护 — 原因:每帧重复调用 set() 都会使图形缓存失效。通过 sync_parameter_manager.gd 路由写入。
  • 方法轨道 — 原因:游戏逻辑应监听分发器信号,而不是解析动画名称。参见 animation_event_dispatcher.gd。

深度方案(按需查看)

主题参考资料 / 脚本
StateMachine / BlendSpace 编辑器方案statemachine-and-blendspace.md
嵌套战斗 / IK / 根运动advanced-graph-recipes.md

参考资料

渐进式披露:仅在研究特定 API 时打开官方文档链接; 将工作分配给相关领域时再加载相关技能——不要预加载整个技能网络。

官方文档
  • 使用 AnimationTree — 标准的 BlendTree / StateMachine / BlendSpace 图工作流,无需自行调用 play() 即可驱动 AnimationPlayer。
  • 动画功能简介 — 了解何时应从仅使用 AnimationPlayer 的动画片段升级到 AnimationTree,以实现混合、状态切换和分层呈现。
  • 动画轨道类型 — 方法轨道和值轨道,可从树正在混合的动画片段中触发游戏事件(脚步声、命中框)。
  • AnimationTree — 本技能中会用到的 active、tree_root、anim_player、根运动 getter,以及 parameters/* 路径约定。
  • AnimationNodeStateMachine — 用于创建嵌套的移动/战斗图,并在代码调用 travel() 前配置好转场。
  • AnimationNodeStateMachinePlayback — 运行时的 travel()、start()、get_current_node(),以及用于代码驱动状态变更的转场路径检查。
  • AnimationNodeStateMachineTransition — 前进条件、auto_advance、Sync、xfade 和优先级规则,可避免转场卡住或立即发生意外转场。
  • AnimationNodeBlendSpace2D — 通过 blend_position 混合定向侧移/瞄准动画(只需速度时请使用 BlendSpace1D)。
  • AnimationNodeBlendTree — 用于上半身瞄准、战斗叠加层和过滤蒙版的分层 Add2/Blend2/OneShot 图。
  • AnimationNodeOneShot — 用于后坐力、受击反应和其他高优先级非循环叠加层的 FIRE/ABORT 请求枚举。
  • AnimationNodeTimeScale — 调整子树的播放速度,以实现加速、眩晕和子弹时间,无需修改 Engine.time_scale。
  • LookAtModifier3D — 与树并行驱动的骨骼注视功能;有关 relative 默认值变更,请参阅 migration-notes.md。
相关技能
前置条件
  • godot-animation-player — AnimationTree 负责播放使用 AnimationPlayer 创建的动画片段;混合前必须确保轨道布局和所有权正确。
  • godot-input-handling — 每个物理帧都会为 blend_position、前进条件和转场目标提供摇杆/键盘向量及动作。
  • godot-signal-architecture — 为方法轨道分发器和动画完成类信号提供安全的连接方式,避免生命周期泄漏。
补充
  • godot-2d-animation — 片段/剪贴画和 2D 运动表现,仍使用 AnimationTree BlendSpaces 或简单的 travel 图。
  • godot-state-machine-advanced — 应由游戏玩法 FSM 管理意图,而由 AnimationTree 管理表现层 travel 和混合。
  • godot-physics-3d — 用于 AnimationTree 根运动提取的 CharacterBody3D / move_and_slide 集成。
  • godot-characterbody-2d — 驱动 StateMachine travel 和 BlendSpace 位置的固定时间步长 2D 运动输入。
  • godot-tweening — 对 TimeScale 或混合量进行补间,使子弹时间和战斗混合渐变可被中断。
  • godot-combat-system — 消耗 OneShot 请求、上半身 Add2 蒙版和嵌套战斗子机器的受击反应/连招层。
  • godot-debugging-profiling — 验证 travel 路径、混合值和屏幕外 active 剔除时的性能分析与日志规范。
下游/使用方
  • godot-genre-action-rpg — 基于这些图模式构建的运动 + 战斗姿态树和技能施放 OneShot。
  • godot-genre-fighting — 对帧敏感的连招自动推进和带蒙版的上半身攻击依赖这里的过渡与 BlendTree 规范。
  • godot-genre-shooter-fps — 叠加在运动 BlendSpaces 上的瞄准/装弹覆盖层、后坐力 OneShot 和注视目标修饰器。
主模块
  • godot-master — 用于跨技能发现的库路由器和镜像模块入口。

评论

支持 Markdown