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

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

https://blog.csdn.net/kenkao/article/details/78908511

从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的热更新来解决。主要丢失的原因是预加载失败。

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

发布了64 篇原创文章 · 获赞 36 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/kuangben2000/article/details/104086133
今日推荐