zoukankan      html  css  js  c++  java
  • 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代码
  • 相关阅读:
    NIO[读]、[写]在同一线程(单线程)中执行,让CPU使用率最大化,提高处理效率
    解码(ByteBuffer): CharsetDecoder.decode() 与 Charset.decode() 的不同
    ACCESS与SQL Server下SQL Like 查询的不同
    试着用c写了一个多线程的同步
    收藏:c语言的多线程同步
    java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] 不能使用 '(未知的)';文件已在使用中
    Linux进程管理
    MySQL数据备份
    MySQL索引
    Socket.IO 概述
  • 原文地址:https://www.cnblogs.com/leiGameDesigner/p/10021364.html
Copyright © 2011-2022 走看看