Aseprite → Godot 像素工作流(上)
视觉资产管线 · 引擎整合 · 实战踩坑 —— 2026-09 整理自我本地工作流文档
定位与分辨率策略
本工作流的视觉目标对标《Celeste》:源资产高分辨率绘制(卡牌 144×200、角色肖像 96×96、地图 1280×900+),
不在运行时放大;缩放只允许 2x/3x 整数倍。渲染后端选 GL Compatibility,纹理过滤 Linear(资产本身高分辨率)。
视觉资产的四个绘制层次
- 造型:先把可辨识轮廓画对(轮廓决定“认得出是谁”)
- 明暗:统一左上 45° 光源,亮边 +20%、暗边 −25%,1px 亮边 + 2px 暗边出体积
- 细节:辨识性元素(胡子/眼镜/符号辉光)——角色之间至少两个特征维度互不相同
- 质感:1–2% 像素随机 ±8% 亮度噪声,消除“塑料感”
Aseprite Lua:程序化绘制要点
- 脚本必须 UTF-8 无 BOM(Aseprite 1.3 不认 BOM)
Sprite(w,h)后必须sprite:newCel(layer, frame).image拿画布- 无内置 rect/circle/渐变——自写
fill / circle / vgrad辅助函数(逐像素 drawPixel) - 抗锯齿线条用 4× 子像素超采样再取平均
- CLI:
--scale 4(不是4x);图集--sheet --data out.json --format json-array;退出码可做 CI 判定
Godot 4.3 整合配置
- 编辑器与导出模板必须同版本(4.3 ↔ 4.3)——Steam 版会自动升编辑器但模板不会,建议固定用工具目录里的 4.3
- 动效节奏:入场 <0.3s 回弹(
Tween.TRANS_BACK + EASE_OUT)、常规 0.4–0.8s、大场面 1–1.5s - 特效三件套:GPUParticles2D(火花/飘字/尘埃)+ Tween 组合 + CanvasModulate/ColorRect 覆盖层
GDScript 实测坑(值得背下来)
| 坑 | 正解 |
|---|---|
tween_callback(func(x): …).bind(x) 报 “Method expected N arguments” | 把 lambda 存变量再 tween_callback(cb.bind(x)) |
| 循环里闭包共享同一个循环变量 | 一律 .bind(i) 传参 |
var x := dict["k"] 类型推断失败 | 显式 var x: int = dict["k"] |
--quit-after N 以为是秒 | 它是“帧数”(headless 上万 fps);测时间用 Time.get_ticks_msec() |
| Timer 未进树就 start | add_child(timer) 后再 start;打字机被旧 Timer 覆盖要 stop + queue_free |
| headless 音频报 “Playback can only happen…” | 正常(无音频设备),不影响真实运行 |
小游戏的交互手感清单(logic_card 已验证)
点击选中/取消(上浮 + 高亮)、出牌飞向桌面 + 计分浮字、雇佣动画(金币飞入 + 槽位弹跳)、 音效全覆盖(出牌/得分/购买/胜负/点击)、事件触发 msg 飘字提示。
打包与 Web 部署原理见下篇。
原文出处:本地工作流项目 item_test_v1/aseprite_godot_workflow/docs(01/03)。