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 }