Unity构建版中Siccity.GLTFUtility Shader加载失败致模型无法加载
问题概况
- 开发Windows平台Unity桌面应用,运行时从磁盘加载glb/gltf格式3D模型
- Unity编辑器内运行正常,但构建后模型无法加载
- 使用Siccity.GLTFUtility库加载,Player.log报错
ArgumentNullException,提示参数shader为空
已尝试方案
- 将相关Shader添加到Always Included Shaders
- 设置Instancing Variants为Keep All
- 保存Shader资产并添加到Preloaded Shaders
- 调整默认质量等级为Very Low
- 禁用Optimize Mesh Data
- 尝试官方推荐的多线程加载方式,但编辑器中也失败
解决建议
1. 确保GLTFUtility自带Shader被完全包含进构建
打开Edit > Project Settings > Graphics,在Always Included Shaders列表中,添加GLTFUtility库所有相关的Shader(可在Project窗口搜索GLTFUtility筛选出对应Shader)。很多时候只添加了自定义Shader,却遗漏了库本身依赖的Shader,导致构建时被Unity优化剔除。
2. 强制标记Shader为构建包含项
选中GLTFUtility的Shader文件,右键选择Asset Labels > Add Label > Always Included,确保这些Shader被Unity明确标记为必须打包的资源,避免被构建剥离机制误删。
3. 在加载代码中指定Fallback Shader
修改GLTFUtility的加载代码,手动指定一个Unity自带且肯定会被打包的Shader作为 fallback,比如Standard Shader:
using Siccity.GLTFUtility; // ... var importSettings = new ImportSettings(); importSettings.ShaderOverride = Shader.Find("Standard"); GLTFSceneImporter.ImportAsync(yourModelPath, importSettings);
这样即使库的Shader未被正确打包,也会用指定的Shader替代,避免空引用报错。
4. 关闭Shader Stripping优化
打开Edit > Project Settings > Graphics > Shader Stripping,将Strip unused variants设置为Disabled,防止Unity剔除GLTFUtility需要的Shader变体。同时关闭Optimize Shaders for GPU,避免GPU优化导致Shader异常。
5. 重新导入库与资产
备份项目后,删除根目录的Library文件夹,重新打开Unity让其重新导入所有资产。这能解决因资产缓存异常导致的Shader引用问题。
6. 验证模型的Shader引用
用第三方GLTFViewer打开你的glb/gltf模型,检查模型自带的Shader名称,确保Unity中存在对应Shader,且该Shader已被加入Always Included Shaders。部分模型可能引用了自定义Shader,需额外处理。
内容的提问来源于stack exchange,提问作者Malindu Kumaradasa

