解决打包AssetBundle时Shader(材质)丢失问题

从Unity4.2开始,为了减少首包大小,不会默认将所有Shader引擎加到游戏程序中,据Unity技术支持人员所说,

Unity会将Shader引擎打包到Assetbundle资源中,但是我测试发现不行(可能是我打开方式不对...),

不过只要将用到的Shader加到Editor->Graphics Settings的Shader列表里再进行打包即可。

直奔问题,unity的assetbundle是对资源的管理方式,但是会有一些注意的地方,

对于具体的打包的使用详细看Unity AssetBundle爬坑手记

下面说一下依赖打包后对于移动设备上出现的一个问题:

依赖打包后,进行加载时却发现丢失,但是贴图信息还在。如图:

在发现对于shader却报了一个错

目前错误是使用的unity的unlit/transparent cutout,通常我们的解决办法是,在将用到的Shader加到Editor->Graphics Settings

的Shader列表里再进行打包即可,然后用下面的脚本的方法去解决:

 

[csharp] view plain copy

  1. public class FixShader : MonoBehaviour {  
  2.   
  3.     private List<Material> thisMaterial;  
  4.     private List<string> shaders;  
  5.    
  6.     void Start ()  
  7.     {  
  8.         thisMaterial = new List<Material>(6);  
  9.         shaders = new List<string>(6);  
  10.   
  11.         MeshRenderer[] meshRenderer = GetComponentsInChildren<MeshRenderer>();  
  12.         int length = meshRenderer.Length;  
  13.   
  14.         for (int i = 0; i < length; i++)  
  15.         {  
  16.             int count = meshRenderer[i].materials.Length;  
  17.             for (int j = 0; j < count; j++)  
  18.             {  
  19.                 Material _mater = meshRenderer[i].materials[j];  
  20.                 thisMaterial.Add(_mater);  
  21.                 shaders.Add(_mater.shader.name);  
  22.             }  
  23.         }  
  24.   
  25.         SkinnedMeshRenderer[] meshSkinRenderer = GetComponentsInChildren<SkinnedMeshRenderer>();  
  26.         length = meshSkinRenderer.Length;  
  27.   
  28.         for (int i = 0; i < length; i++)  
  29.         {  
  30.             int count = meshSkinRenderer[i].materials.Length;  
  31.             for (int j = 0; j < count; j++)  
  32.             {  
  33.                 Material _mater = meshSkinRenderer[i].materials[j];  
  34.                 thisMaterial.Add(_mater);  
  35.                 shaders.Add(_mater.shader.name);  
  36.             }  
  37.         }  
  38.   
  39.          
  40.         for( int i = 0; i < thisMaterial.Count; i++)  
  41.         {  
  42.             thisMaterial[i].shader = Shader.Find(shaders[i]);  
  43.         }  
  44.     }  
  45. }  

这样是解决了丢失问题,但是自己编写一个shader,或者使用一个shader时,总不能每次都用去进行Editor->Graphics Settings里去添加shader,然后在进行发包。如果不进行添加或者忘记添加,发布在移动设备后还是会丢失。

 

那对于编辑的shader的解决方法是

1.依赖打包
2.shader放到Resources文件夹,必须是Resources文件夹里。

对于资源的热更新,难免有新的shader进行使用,要考虑到对shader的热更新来解决。主要丢失的原因是预加载失败。

如有不当之处,还请指教补充。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity打包 WebGL 游戏,涉及到的着色器(Shader)需要进行一些特殊处理才能正确运行。下面是一个简单的步骤: 1. 确保你的着色器和材质Unity 编辑器中正确显示和运行。确保着色器代码中没有使用不支持 WebGL 的功能。 2. 在 Unity 编辑器中选择 File -> Build Settings 打开构建设置窗口。 3. 在构建设置窗口中,选择 WebGL 平台并点击 Switch Platform 切换到 WebGL 平台。 4. 在 WebGL 设置中,选择 Player Settings 打开游戏玩家设置。 5. 在玩家设置中,确保在“Other Settings”部分,“Scripting Backend”设置为“IL2CPP”。这是为了确保 WebGL 构建使用 IL2CPP 脚本编译器。 6. 在玩家设置中,找到“Publishing Settings”部分的“WebGL Template”设置。选择一个你喜欢的模板,或者点击“New Template”创建自定义模板。 7. 完成上述设置后,点击 Build 按钮开始构建 WebGL 游戏。 8. 构建完成后,在指定的输出文件夹中会生成一个网页文件夹。将该文件夹上传到 Web 服务器上,或者通过本地文件系统打开 index.html 文件来运行游戏。 注意事项: - WebGL 平台上的性能可能会受限,因此确保优化你的着色器和代码以提高性能。 - 一些高级的着色器特性可能不被支持或以不同的方式工作。在开发过程中请测试并确保一切正常。 - 在处理跨域请求可能会遇到问题,需要在服务器上进行正确的设置。 希望这些步骤能帮助你成功打包和运行 WebGL 游戏!如有其他问题,请随提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值