关于 godot-animation
面向 Godot 4.7 的动画技能,讲解如何选择并驱动 AnimationPlayer、AnimationTree 和 Tween。适用于制作关键帧动画、角色状态混合、精灵表动画以及代码控制的短动画。
主要功能
- 01使用 AnimationPlayer 制作关键帧片段
- 02用 AnimationTree 混合和切换动画状态
- 03通过 Tween 插值属性变化
- 04驱动 2D 精灵表动画
- 05通过信号和方法轨道响应动画事件
适用场景
- 01制作角色待机、行走和奔跑状态切换
- 02播放攻击动画并等待片段结束
- 03为 UI 元素添加淡入或缩放效果
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ gamedev-skills/ awesome-gamedev-agent-skills --skill godot-animation安装后在 Claude Code 中输入/godot-animation确认已加载。
附带文件references/animation-tree-and-tween.md
详细介绍
Godot 动画(4.x)
选择并驱动合适的动画工具:AnimationPlayer(片段)、AnimationTree
(混合/状态机)或 Tween(短时程序化动作)。目标版本为 Godot 4.7。
适用场景
- 用于播放关键帧动画、混合行走/奔跑/待机状态、制作精灵表动画,或在代码中为 UI/对象添加补间动画。
**不适用场景:**决定播放哪个状态的移动 逻辑 → godot-2d-movement;UI 布局(而非 UI 补间动画)→ godot-ui-control;着色器驱动的效果 → godot-shaders。
核心工作流
- 选择工具:
AnimationPlayer— 制作关键帧动画片段(变换、属性、方法调用、音频,甚至其他动画)。它是片段数据的唯一事实来源。AnimationTree— 在运行时通过状态机和/或混合空间混合这些片段并在片段间切换。需要从AnimationPlayer获取片段。Tween— 在代码中创建即发即弃的程序化插值(create_tween());适合 UI 弹出、淡入淡出和一次性动作。
- **对于 2D 精灵表:**使用
AnimatedSprite2D+SpriteFrames,或在AnimationPlayer中为frame属性设置关键帧。 - **对于角色:**在
AnimationPlayer中制作片段,然后添加AnimationTree(active = true),设置其anim_player,并将AnimationNodeStateMachine或AnimationNodeBlendSpace2D设计为树根节点。 - 从代码驱动状态切换:通过播放对象(
travel)或设置混合参数。 - 响应片段事件:使用
animation_finished信号以及调用/方法轨道。
模式
1. AnimationPlayer:播放片段并等待其结束
@onready var anim: AnimationPlayer = $AnimationPlayer
func attack() -> void:
anim.play("attack")
await anim.animation_finished # resume after the clip ends
anim.play("idle")
2. AnimationTree 状态机:在状态间切换
@onready var tree: AnimationTree = $AnimationTree
func _ready() -> void:
tree.active = true # the tree drives animation; AnimationPlayer is the source
func set_state(state: StringName) -> void:
# The playback object controls an AnimationNodeStateMachine root.
var sm: AnimationNodeStateMachinePlayback = tree.get("parameters/playback")
sm.travel(state) # transitions using the graph's connections
func _physics_process(_d: float) -> void:
set_state(&"run" if velocity.length() > 5.0 else &"idle")
3. 混合空间:通过 2D 参数混合奔跑方向
# Root is an AnimationNodeBlendSpace2D named "Move" with idle/run points placed in it.
func update_locomotion(input_dir: Vector2) -> void:
# Parameter path = "parameters/<node name>/blend_position".
tree.set("parameters/Move/blend_position", input_dir)
4. Tween:淡出并缩放 UI 元素(由代码驱动)
func pop_in(node: Control) -> void:
node.scale = Vector2.ZERO
node.modulate.a = 0.0
var tw := create_tween() # bound to this node's tree
tw.set_parallel(true) # run the two tweens together
tw.tween_property(node, "scale", Vector2.ONE, 0.2) \
.set_trans(Tween.TRANS_BACK).set_ease(Tween.EASE_OUT)
tw.tween_property(node, "modulate:a", 1.0, 0.2) # sub-property via ":"
易错点
AnimationTree.active保持为 false → 不会播放任何动画,travel()看起来也毫无效果。设置active = true并指定anim_player路径。- 参数路径错误。 混合/条件路径的格式为
"parameters/<NodeName>/...",必须与树中的节点名称完全一致(例如"parameters/playback"、"parameters/Move/blend_position")。拼写错误会被静默忽略。 - AnimationPlayer 和 AnimationTree 相互争用。 当
AnimationTree处于激活状态时,不要同时对相同轨道调用AnimationPlayer.play()— 让树负责播放。 - 3.x 的 Tween 节点已移除。 4.x 中不再有可添加的
Tween节点;请在代码中使用create_tween()创建补间动画(它会返回一个Tween)。补间动画会自动开始,并在结束后自动释放。 - 重复使用已结束的补间动画。 补间动画只能使用一次;要播放新动画,请再次调用
create_tween()。需要重复播放时请使用set_loops()。 yield/yield(anim, "...")已移除。 请使用await anim.animation_finished。- 子属性补间动画使用冒号:
"modulate:a"、"position:x"。若对整个属性添加补间动画,则会覆盖其他子属性。
参考资料
- 有关状态机转换/条件、根运动、单次播放/混合节点、方法和调用轨道、
SpriteFrames/AnimatedSprite2D,以及 Tween 缓动/串联/回调的内容,请阅读references/animation-tree-and-tween.md。
相关技能
godot-2d-movement— 提供用于选择动画的速度/状态。godot-ui-control— 提供由 Tween 添加动画的 UI。godot-3d-essentials— 使用 AnimationTree 驱动的 3D 角色场景。game-ai— 与动画状态相对应的状态机。
评论
支持 Markdown