首页 > 手游开发 > Unity3D > Unity 移动平台自己编写Shader丢失问题
2019
02-26

Unity 移动平台自己编写Shader丢失问题

问题一:使用AB加载资源,资源中包含有第三方shader,加载出的资源出现shader丢失的显示问题

这是因为Unity在打包的时候,会进行资源精简,默认情况下,是不会将第三方shader打包进入包体的。

为了解决问题,我们需要按照以下步骤操作: Edit->ProjectSetting->Grahpics->Always Included Shaders,在这里面加入要使用的shader。

Unity 移动平台自己编写Shader丢失问题 - 第1张  | 逗分享开发经验

问题二:在编辑器中,即便按照一中的方式做了,但是还是看不到shader效果

这个问题,可以不用解决,因为虽然在Editor中看不到效果,但是打包到真机上运行,即可正确显示。

但是,这样看着的确很蛋疼,有一个方法可以修复:手动重新给材质球赋值一遍shader即可,自动赋值代码如下:

Unity 移动平台自己编写Shader丢失问题 - 第2张  | 逗分享开发经验Unity 移动平台自己编写Shader丢失问题 - 第3张  | 逗分享开发经验

 1 public class FixShader : MonoBehaviour {  2     private List<Material> thisMaterial;  3     private List<string> shaders;  4   5     private void Awake()  6     {  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         Image[] images = GetComponentsInChildren<Image>(); 41         length = images.Length; 42  43         for (int i = 0; i < length; i++) 44         { 45             var m = images[i].material; 46             thisMaterial.Add(m); 47             shaders.Add(m.shader.name); 48         } 49  50  51         for (int i = 0; i < thisMaterial.Count; i++) 52         { 53             thisMaterial[i].shader = Shader.Find(shaders[i]); 54         } 55     } 56 }

自动赋值shader代码

 

最后编辑:
作者:小熊, 维尼
这个作者貌似有点懒,什么都没有留下。

留下一个回复

你的email不会被公开。