HOME / 第 4 部分 · UI 界面 · 动画 · 特效 / 第 39 课
MODULE 4 · UI 界面 · 动画 · 特效

第 39 课 · AnimationPlayer 动画播放器

⏱ 预计时长 35 分钟📊 难度 入门📚 模块 第 4 部分 · UI 界面 · 动画 · 特效

🎯 本课学习目标

让角色动起来:AnimationPlayer 是 Godot 的动画大管家。本课学会关键帧动画。

📖 详细教学步骤

添加 AnimationPlayer搭建

  1. 在要动画的节点(如玩家)下加子节点 AnimationPlayer
  2. 选中 AnimationPlayer,检查器顶部出现「动画」面板(底部也会出现动画编辑器)
  3. 点底部动画面板的「动画」下拉 → 新建(New)→ 命名 walk

录制关键帧操作

  1. 选中玩家精灵 Sprite2D
  2. 在底部动画面板点 关键帧按钮(菱形) 或按快捷键插入关键帧
  3. 拖动时间轴到另一个位置,修改精灵的 position/rotation 等属性,再插关键帧
  4. 点「播放」预览,Godot 自动补间两帧之间

💡 关键帧 = 记录「某时刻某属性的值」,Godot 自动平滑过渡。

动画时间与循环操作

  • 时间轴长度:拖动右侧的「结束时间」手柄
  • Loop Mode(循环模式):Linear 循环播放、None 播一次停
  • 走路动画一般循环,跳跃动画一般不循环

用代码控制动画代码

播放、暂停、切换:

GDSCRIPTextends CharacterBody2D

@onready var anim: AnimationPlayer = $AnimationPlayer

func _physics_process(delta):
    var moving = Input.is_action_pressed("move_left") or \
                 Input.is_action_pressed("move_right")
    if moving:
        anim.play("walk")     # 播放走路动画
    else:
        anim.play("idle")     # 播放待机动画
    # 其他常用
    # anim.pause()     暂停
    # anim.stop()      停止
    # anim.is_playing() 是否在播放

动画播放完成检测代码

等动画播完再做某事(如攻击结束):

GDSCRIPTfunc _ready():
    anim.animation_finished.connect(_on_anim_finished)

func _on_anim_finished(anim_name: String):
    print(anim_name, " 播放完成")
    if anim_name == "attack":
        can_attack = true   # 攻击动画结束,允许再次攻击

动画里播放声音/调用函数进阶

在动画时间轴插入「方法调用轨」(Animation Track → 方法调用):

  • 可以在动画某帧调用节点的函数(如 play_sound())
  • 也可以加属性轨做「镜头抖动」等复杂效果
  • 这是高级动画设计,先了解即可
⚠️
动画没播放?

确认:①动画名拼写一致;②动画已创建(不是空);③调用了 play()。

⚠️
动画里改了属性回不去?

动画播放会把属性改成动画值。想恢复初始值,设置动画后或播完调用 anim.seek(0, true) / 重新赋值。

🧪 动手试一试

🏋️ 课后练习

给角色做两个动画:idle(原地微浮动)和 walk(前后移动精灵),用方向键切换播放。

动画编辑器拖时间轴 + 插关键帧;代码按移动状态 play("walk") / play("idle")。

💡

动画面板右下角可调播放速度(播放速率),慢放动画调试很方便。

💡

关键帧快捷键:I(插入),适用于选中属性的时间点。

🎓 本课小结

AnimationPlayer 用关键帧做动画:拖时间轴 → 改属性 → 插帧 → 循环设置;代码里 anim.play(名字) 播放,animation_finished 监听结束。