UnityEditor加载AssetBundle模型变为粉色

在Unity游戏开发中,AssetBundle在不同平台间的兼容性问题可能导致Shader渲染失败,表现为粉色。解决方法包括修改Windows平台的Graphics API为OpenGLES3或在运行时动态替换Shader代码。后者可能引入一些效果差异,比如原本应透明渲染的物体在不透明层渲染。本文提供了具体的修复代码和步骤。
摘要由CSDN通过智能技术生成

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}");
                }
            }
        }

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值