返回列表

2026-07-26

在 Godot 里用精灵图做 2D 角色动画 — 从导入到播放

Godot 做 2D 很称手,但没有能动的角色就没法开工。这篇文章把整条路走完:把从一张角色图生成的精灵图放进 Godot 4 项目,切成帧、注册成动画,再用代码播放。

准备图集和元数据

在 GenioPlus 动画工具上传角色图,选一个动作预设(待机、行走、挥砍、跳跃、施法、受击),会生成一小段视频,从中抽帧再拼成精灵图。下载时除了 PNG 图集,还会附带一份元数据 JSON,里面记着帧尺寸、列×行和间距(padding)——下一步正好要用这些数字。图集 PNG 放进 res:// 下的任意目录,Godot 会自动导入。

用 AnimatedSprite2D 切帧

在场景里添加 AnimatedSprite2D 节点,在检查器的 Sprite Frames 属性里新建一个 "New SpriteFrames",编辑器底部就会打开 SpriteFrames 面板。点面板上的 "Add frames from a Sprite Sheet",选中图集 PNG,会弹出一个设置窗口:把横向、纵向格数(Horizontal / Vertical)填成元数据 JSON 里的列×行。如果图集带留白,再把 Separation 和 Offset 也对上,帧边界就能切得严丝合缝。在预览里选好要用的帧,点 "Add N Frames" 即可。

动画命名与播放速度

新建的动画默认叫 "default",双击改成 walk、idle、attack 之类,再用面板左侧列表的 "+" 添加多个动画,全部装在同一个 SpriteFrames 资源里。播放速度用 Speed (FPS) 调,行走循环一般 8~12 FPS 就挺自然。循环播放用 Loop 开关打开;攻击这类只播一次的动作要关掉。

用代码播放

播放就是对节点调用 play(),例如 $AnimatedSprite2D.play("walk")。左右移动不用再做一张图集,用 flip_h 属性翻转即可(按 velocity.x 的正负来设置 sprite.flip_h)。没有移动输入时切回 play("idle");攻击这类一次性动作可以监听 animation_finished 信号,播完再回到待机,状态切换会干净很多。

什么时候改用 Sprite2D + AnimationPlayer

如果你想把换帧和位置、旋转、碰撞开关、音效放进同一条时间轴,那 Sprite2D 加 AnimationPlayer 更合适。把图集放进 Sprite2D 的 Texture,在 Animation 分组里把 Hframes/Vframes 设成列数和行数,就能用 Frame 值选帧了。在 AnimationPlayer 里新建动画,定好长度(比如 0.6 秒)和 Loop,再对 Frame 属性按固定间隔打关键帧即可。如果画面里帧之间出现被插值糊掉的中间状态,把该轨道的更新模式改成 Discrete,帧就会硬切。

像素风记得把滤镜设为 Nearest

从 Godot 4 起,2D 纹理滤镜放在节点的 CanvasItem 属性里(项目设置里的值作为默认值)。像素图集发糊时,在 AnimatedSprite2D 或 Sprite2D 的检查器里把 CanvasItem > Texture > Filter 改成 Nearest。想全项目生效,就在项目设置的渲染 > 纹理里把默认纹理滤镜设为 Nearest。另外像素纹理建议用 Lossless 压缩,除非镜头会大幅拉远,否则不要开 mipmap。

开始动手

只要有一张角色图,就能用行走预设导出一张图集,按上面的步骤放进 Godot 试试。去背景和抠图编辑不消耗积分,可以先看看自己的角色能抠得多干净。

用一张角色图亲自试试

去试试工具
在 Godot 里用精灵图做 2D 角色动画 — 从导入到播放