您的位置:首页 > 移动开发 > Unity3D

Unity 编辑器环境下不能正确加载Android Assetbundle 中的 Shader 解决方法

2017-06-30 16:49 666 查看
版权声明:本文转自http://blog.csdn.net/huutu 转载请带上 http://www.thisisgame.com.cn
今天老大发现 UnityEditor 在 Android 下打出来的 android 的
Assetbundle,加载之后 Shader 不能正确的执行!!!

文章转自http://blog.csdn.NET/huutu http://www.thisisgame.com.cn


查看 Shader 属性,看到 提示 说 该 Shader 不支持我的显卡



文章转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn
但是仔细看 Shader 也没什么问题,于是到官网找了一个最简单的Shader 来替换

[cpp] view
plain copy

Shader "Custom/NewShader" {  

    Properties  

    {  

        _MainTex ("Texture", 2D) = "white" {}  

    }  

    SubShader  

    {  

        Tags { "RenderType"="Opaque" }  

        LOD 100  

  

        Pass  

        {  

            CGPROGRAM  

            #pragma vertex vert  

            #pragma fragment frag  

            // make fog work  

            //#pragma multi_compile_fog  

              

            #include "UnityCG.cginc"  

  

            struct appdata  

            {  

                float4 vertex : POSITION;  

                float2 uv : TEXCOORD0;  

            };  

  

            struct v2f  

            {  

                float2 uv : TEXCOORD0;  

                //UNITY_FOG_COORDS(1)  

                float4 vertex : SV_POSITION;  

            };  

  

            sampler2D _MainTex;  

            float4 _MainTex_ST;  

              

            v2f vert (appdata v)  

            {  

                v2f o;  

                o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);  

                o.uv = TRANSFORM_TEX(v.uv, _MainTex);  

                //UNITY_TRANSFER_FOG(o,o.vertex);  

                return o;  

            }  

              

            fixed4 frag (v2f i) : SV_Target  

            {  

                // sample the texture  

                fixed4 col = tex2D(_MainTex, i.uv);  

                // apply fog  

                //UNITY_APPLY_FOG(i.fogCoord, col);  

                return col;  

            }  

            ENDCG  

        }  

    }  

}  

然而还是一样的。

黄天不负我的苦心。。。终于到Unity 论坛找到相关的帖子。

[html] view
plain copy
http://answers.unity3d.com/questions/238109/problem-with-materials-after-creating-asset-bundle.html  
这居然是一个 2012年就存在的 Bug ,好嗒一只 。

解决办法就是,在 Assetbundle Load完之后,遍历 Material ,把所有的 Shader 都重新 Load 赋值一次。

[csharp] view
plain copy

if (GUILayout.Button("Load Cube"))  

{  

    AssetBundle assetbundle = AssetBundle.CreateFromFile(Application.dataPath + "/bundleNoLZMA/Cube.prefab.unity3d");  

#if UNITY_EDITOR  

    var materials = assetbundle.LoadAll(typeof(Material));  

    foreach (Material m in materials)  

    {  

        var shaderName = m.shader.name;  

  

        var newShader = Shader.Find(shaderName);  

        if (newShader != null)  

        {  

            m.shader = newShader;  

        }  

        else  

        {  

            Debug.LogWarning("unable to refresh shader: " + shaderName + " in material " + m.name);  

        }  

    }  

#endif  

    Instantiate(assetbundle.mainAsset);  

}  

文章转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn
测试Ok



UnityEditor 的确是没有正确从Assetbundle 中加载出来 Shader ,上面代码里面重新给Material 赋值一次,其实是 读取到了 没有被打成Assetbundle 的Shader 。

我们把Asset 里面的 Shader 源文件删掉,上面的代码也无能为力了。( 下图中我把 NesShader 删掉了 )



查看编译之后的Shader代码,发现Unity在把Shader打包到对应的平台的时候,可能没有考虑到这个Shader会在编辑器下面运行。所以只把Shader打包到单个平台并且执行。

其实可以在判断当前是在编辑器下不要执行 Assetbundle中的Shader,使用原来的Shader 就好。不过这也不是很大的问题,不然也不会一直不解决。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  shader assetbundle
相关文章推荐