UnityEditor加载AssetBundle模型变为粉色

Unity游戏开发过程中,在UnityEditor下,我们通常直接使用游戏资产(lua代码,prefab,图片,材质等)。而游戏发布后则通常资产导出为AssetBundle以给游戏使用。

Unity会为不同的平台(android,ios,windows)生成不同的AssetBundle,如果我们在UnityEditor下面直接使用为android或者ios平台生成的AssetBundle通常会表现为粉色(shader渲染失败),其原因就是Android平台上编译好的shader(OpenGLES3、Vulkan),在Windows(Direct3D11,)下不支持。

解决方式1:Windows平台的Graphic APIs的第一个修改为OpenGLES3,并重启编辑器,重启后Shader丢失(变粉)的问题得到解决,但某些Unity版本(2021.1.24f1)的Inspector面板出现bug

操作方法如下图

 

解决方式2:AssetBundle加载完成后,替换其中的shader代码如下:

但是这种方式也有一些问题,变现为某些带有变体的shader的效果差异。

如我这边碰到的一个问题,本来是在透明层渲染的shader,确在不透明层渲染了,在Hierarchy面板下找到这个物体,然后再Inspector面板下展开材质的参数,回到了透明层渲染。

_loaderData.assetObject = _assetBundleRequest.asset;
AssetUtil.Editor_ReplaceShader(_loaderData.assetObject as GameObject);
  [System.Diagnostics.Conditional("UNITY_EDITOR")]
        public static void Editor_ReplaceShader(GameObject go)
        {
            if (go == null)
            {
                return;
            }
            Renderer[] renderers = go.GetComponentsInChildren<Renderer>(true);
            foreach (var renderer in renderers)
            {
                UnityEngine.Material[] matArr = renderer.sharedMaterials;
                foreach (var mat in matArr)
                {
                    Editor_ReplaceShader(mat, go.name);
                }
            }

        }
        [System.Diagnostics.Conditional("UNITY_EDITOR")]
        public static void Editor_ReplaceShader(Material mat, string gameObjectName = null)
        {
            if (mat != null && mat.shader != null)
            {
                Shader shader = Shader.Find(mat.shader.name);
                if (shader != null)
                {
                    mat.shader = shader;
                }
                else
                {
                    UnityEngine.Debug.LogError($"can't find the shader material={mat}, gameObject={gameObjectName}, shader={mat.shader.name}");
                }
            }
        }

猜你喜欢

转载自blog.csdn.net/PangNanGua/article/details/127867543