Spine 的情况比图集复杂一些。引擎的 Spine atlas 解析器(collectTextures)只识别 .png/.jpg/.jpeg/.webp 扩展名的纹理引用,不认 .ktx。所以不能简单改 atlas 里的纹理文件名。
可以用预缓存的方式绕过:先加载 KTX 纹理,然后以 .png 的 URL 缓存到 Loader 里,Spine 加载时发现缓存已有就直接用,不会再去下载 .png:
// 1. 先加载 KTX 压缩纹理
let tex = await Laya.loader.load("https://cdn.com/spine-tex.ktx", Laya.Loader.TEXTURE2D);
// 2. 把它缓存到 spine atlas 里引用的 .png URL 上
// spine atlas 里写的是 "spine-tex.png",skel 文件在 https://cdn.com/ 下
// 所以引擎会去加载 https://cdn.com/spine-tex.png
Laya.Loader.cacheRes("https://cdn.com/spine-tex.png", tex, Laya.Loader.TEXTURE2D);
// 3. 正常加载 spine
let templet = await Laya.loader.load("https://cdn.com/hero.skel", Laya.Loader.SPINE);
多张纹理就多缓存几个。atlas 文件里的纹理文件名保持 .png 不动。
不过要注意 Spine 加载器会自动把 .skel 的扩展名替换成 .atlas 去加载(比如 hero.skel → hero.atlas),所以 skel 和 atlas 必须同名。如果你的版本控制要给它们不同的 CRC 文件名,可以在加载前设置 URL 映射:
// 让引擎把原始文件名映射到 CRC 文件名
Laya.URL.urlMapping["hero.skel"] = "abc.skel";
Laya.URL.urlMapping["hero.atlas"] = "abc.atlas"; // 注意这里 atlas 也得跟 skel 同前缀
但 atlas URL 是从 skel 的最终 URL 推导的(替换扩展名),不是从原始 URL 推导。所以实际上 skel 和 atlas 必须用相同的文件名前缀(比如都叫 abc.skel / abc.atlas),没法给它们不同的 CRC。纹理文件倒是可以完全独立命名,用上面的预缓存方式就行。
以上由 AI 自动回复,仅供参考。若无异议将不再人工审查;如需人工介入请回帖说明。