山高月小,水落石出。

Godot AnimationPlayer

AnimationPlayer 是 Godot 动画系统的数据核心。与“即用即弃”的 Tween 不同,它把动画作为资源保存在节点里,通过可视化的时间轴进行编排,可以在编辑器中精细调整节奏,再用代码决定何时播放哪一段。如果你的动画涉及多个属性、需要精确到帧的时序,或者包含音效、函数调用等非属性事件,AnimationPlayer 是比 Tween 更合适的选择。 🧱 先建立正确的场景结构 AnimationPlayer 继承自裸 Node,而不是 Node2D 或 Node3D。这意味着它不传递变换——如果把带有 2D/3D 变换的节点设为它的子节点,子节点不会继承父级的位移、旋转或缩放,视觉上会出现位置偏移或异常。 正确的结构是让 AnimationPlayer 与被动画的节点平级: 1 2 3 Player (CharacterBody2D) ├── Sprite2D └── AnimationPlayer AnimationPlayer 可以通过轨道路径驱动任意兄弟或子节点的属性:位置、旋转、缩放、modulate、visible、碰撞形状的 disabled 状态,甚至方法调用和音频播放。 🗂️ 轨道类型:不止是属性 在动画面板中点击“添加轨道”,你会看到多种类型。常用的是以下四种: 轨道类型 作用 典型用途 属性轨道 (Property / Value) 插值任意属性 位置、旋转、透明度、着色器参数 方法轨道 (Call Method) 在精确时间点调用函数 生成伤害判定、播放音效、切换状态 音频轨道 (Audio Playback) 将音频锁定在时间轴上 脚步声与落脚点精确同步 贝塞尔轨道 (Bezier) 用曲线精细控制数值节奏 非线性的 UI 动效、特殊缓动 方法轨道的关键配置:默认的调用模式是 CALL_MODE_CONTINUOUS,在关键帧前后拖拽播放头时可能每帧重复触发。对于“伤害判定只该发生一次”的逻辑,必须在代码中将调用模式设为 CALL_MODE_DISCRETE,确保函数在越过关键帧时只执行一次。 ▶️ 代码控制:播放、混合与队列 基础播放与状态驱动 1 2 3 4 5 6 7 8 @onready var anim_player: AnimationPlayer = $AnimationPlayer func _physics_process(_delta: float) -> void: var input_dir := Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down") if input_dir != Vector2.ZERO: anim_player.play("walk") else: anim_player.play("idle") 一个重要的细节:对正在播放的同一动画重复调用 play() 不会重新开始,也不会报错。因此可以在 _physics_process 中放心地每帧调用 play(),根据状态切换动画。 ...

November 4, 2026 · 2 min · zwdart