DIY精灵能够进入关卡
昨天 11:23综合
PNG fallback 已经工作了。现在要打通 NpcEditor → 游戏 的信道,我先看清楚 NpcEditor 保存的数据格式 vs cacheNpcPixels 期望的格式
关键问题找到了。cacheNpcPixels 期望的像素格式是 sparse表({ ["row,col"] = {r,g,b,a} }),而 NpcEditor 的 pixelsToSparse 确实保存这种格式 ✓。数据格式是对的。
现在问题是:NpcEditor 保存 → 进入关卡这个流程能否走通。最可靠的方案是绕过文件 I/O
架构已经清晰了。当前流程理论上可行(本地文件→读取),但有一个根本性的问题:LoadNpcSprites 开头会 npcSpriteCache_ = {} 全量清空缓存,而且依赖文件 I/O 时序。
最可靠的方案是内存直注(in-memory inject):NpcEditor 保存时直接把 sparse 数据注入 Render 的一个持久注册表,进入关卡时从这个注册表合并,无需文件 I/O。
第一步:Render.lua 加持久注册表 + 暴露注入接口
第二步:LoadNpcSprites 进入关卡时从注入表合并,确保缓存重置后数据不丢失
第三步:NpcEditor 保存时直接调用注入接口
注意 InjectEnzymeNpcSprite 里的 firstFrame 是 buildSaveData() 里经过 pixelsToSparse 的 sparse 格式,而 cacheNpcPixels 也正好期望 sparse 格式,两边格式完全匹配。但要确认一下:InjectEnzymeNpcSprite 里直接取的 idleAnim.frames[1],这是 sparse 格式;而 DrawPixelSpriteBatched 接收的 pixels 参数同样是 sparse。
构建成功。整个信道现在是:
NpcEditor 保存
↓ buildSaveData() → sparse 像素数据("row,col"={r,g,b,a})
↓ Render.InjectEnzymeNpcSprite(name, saveData)
↓ 写入 injectedEnzymeSprites_[name] + 立即写入 npcSpriteCache_[name]
↓ 同次会话:不用重进关卡,NPC 立即可见 ✓
进入关卡(LoadNpcSprites)
↓ npcSpriteCache_ = {} (清空)
↓ 从 injectedEnzymeSprites_ 合并 ←── 这步保证数据不丢失
↓ DrawEnzymeNpc → spriteData 存在 → 画像素精灵 ✓
跨会话(重启游戏)
injectedEnzymeSprites_ 为空
↓ LoadNpcSprites 读本地文件 npc_sprites/唾液淀粉酶.json ←── 持久化备份
↓ 或 clientCloud BatchGet 兜底
测试步骤:
进 NpcEditor,修改唾液淀粉酶造型,点保存
日志应出现:[Render] InjectEnzymeNpcSprite: '唾液淀粉酶' injected (xxx px, grid=32)
退出编辑器,进入口腔关卡,放酶塔
NPC 应显示你在编辑器里设计的像素精灵
三个根因及修复
LoadNpcSprites 遇到无敌人绑定的关卡提前 return → 酶 NPC 分支被跳过
npcSpriteCache_ 每次进关卡清空 → 引入 injectedEnzymeSprites_ 持久注册表
编辑器保存只写文件,没有通知运行时 → 保存时同步调用内存直注接口
完整管线图(编辑器 → 本地文件 + 内存直注 → LoadNpcSprites 合并 → DrawEnzymeNpc)
性能优化(注入时降采样 32×32、LOD 阈值退回 PNG)
未来动画改造要点(存储结构、cacheKey 格式)




