角色动画:帧对齐比帧数更重要
先让站立、朝向与移动一致,再追求更多动作。
01两种常见路径
AnimatedSprite2D 配合 SpriteFrames 适合播放逐帧图片;AnimationPlayer 适合编排属性变化,也可以控制精灵帧。二者不是谁全面替代谁。第一个角色练习先用 AnimatedSprite2D 播放一个中性动画,再接移动状态,不在没有采用角色素材时假装动画资产已齐备。
02帧表需要确认什么
| 检查项 | 为什么 |
|---|---|
| 帧尺寸与切片边界 | 切错会读到隔壁方向或空白 |
| 固定画布与脚点 | 否则动画会一跳一跳 |
| 方向顺序 | 四方向排列没有通用强制顺序 |
| 循环与速度 | 站立、行走、一次性动作含义不同 |
| 透明边缘 | 重复播放会放大脏边闪烁 |
| 实际显示尺寸 | 展示图比例不等于游戏比例 |
03播放一段自绘练习动画
- 自己画两张简单几何帧,保持相同画布与脚点,不必生成正式角色。
- 创建 AnimatedSprite2D,新建 SpriteFrames,添加名为 practice 的动画。
- 导入两帧,设置一个容易观察的低速循环,手动播放。
- 把它接到移动脚本前,先独立确认每帧位置与透明度一致。
extends AnimatedSprite2D
func _ready() -> void:
if sprite_frames == null or not sprite_frames.has_animation(&"practice"):
push_error("缺少 practice 动画资源")
return
play(&"practice")04移动和动画必须共享明确状态
移动脚本负责实际速度;动画表现读取运动方向或状态。速度为零时保存最近有效朝向,避免站立时每帧跳回默认方向。不要让动画节点再单独读另一套按键逻辑,导致玩家已被 UI 锁住但仍播放走路。接入时重新验证停止、斜向、转身和输入锁。
05先做翻页检查,再看流畅播放
把两到四张自绘练习帧放在固定画布中,先不要播放,逐帧切换观察头顶、脚点与身体重心。可以在独立辅助层画一条地面基准线,确认脚点没有随着裁切跑动。快速播放会让你注意动作是否流畅,却可能掩盖某一帧突然偏移;逐帧检查正适合找这种问题。
接着以很低的速度循环,再逐步提高到你想比较的速度。区分“动作本身不连贯”和“播放太快来不及看清”:前者需要调整姿态与过渡,后者可能只需调整播放速度。不要一看到跳动就补更多中间帧,若根因是画布或脚点不统一,加帧只会制造更多需要重新对齐的图片。练习参数不代表正式角色动画帧率已经确定。
06把动画状态写成一张输入输出表
先用最简单的站立和行走两种表现。表的输入可以包括是否允许移动、当前移动方向以及最近有效朝向,输出是要播放的动画。松键后速度为零,但角色仍可以保留最后朝向;打开对话后,即使按键仍被按住,也不应由动画节点独自认定玩家正在自由走动。
让动画读取移动控制者提供的明确状态,而不是再写一套独立键盘判断。随后测试向右走再松键、向上走再打开面板、关闭面板后不按键、斜向移动后停止。每个动作都写下预期朝向和动画名称。如果两段脚本轮流调用不同动画,可能出现不停重启动作的效果;此时先找出谁拥有最终动画选择权,不要靠提高播放速度掩盖闪烁。
07导入精灵表时,先验证边界和方向顺序
一张精灵表看起来排列整齐,并不保证每一行都代表同样方向,或每格尺寸都符合你猜测的数字。先数行列、查看实际像素宽高,并核对是否包含间距、空白和非动画装饰。只导入一组最容易辨认的帧进行检查,确认没有读到邻格或裁掉边缘,再扩展到其他方向。
保存 SpriteFrames 资源后关闭重开工程,确认动画名称、循环设置和帧顺序保持正确。缺少动画时应有清楚提示,不把默认空动画当作正常播放。完成证据可以是一张帧检查表与四种输入路径的观察记录,包括脚点、方向、停止和输入锁。没有正式采用角色素材时,练习仍只使用中性自绘图形;技术流程成立与角色美术完成是两个独立结论。
动手后,再勾选
不是“我看懂了”,而是你在独立练习里做出并检查过。
换一个情景,你会怎么判断?
走路动画脚底不停抖动,优先检查什么?
用自己的话,留一条笔记
可以写“我之前以为……,现在发现……”,或者记录还没解决的问题。
↗回到资料核对
本课是解释与练习,不替代对应版本的官方手册。网页实验不运行 Godot;未标明实机验证的代码,仍需在独立工程中检查。
标记已读不会自动勾选实作,也不代表游戏功能已经完成。