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

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

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

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

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

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

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

 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代码

 

posted @ 2018-11-26 16:57  gameDesigner  阅读(1136)  评论(0编辑  收藏  举报