今天老大发现 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 来替换

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 论坛找到相关的帖子。

http://answers.unity3d.com/questions/238109/problem-with-materials-after-creating-asset-bundle.html

这居然是一个 2012年就存在的 Bug ,好嗒一只 。


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

if (GUILayout.Button("Load Cube")){AssetBundle assetbundle = AssetBundle.CreateFromFile(Application.dataPath + "/bundleNoLZMA/Cube.prefab.unity3d");#if UNITY_EDITORvar 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);}}#endifInstantiate(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 就好。不过这也不是很大的问题,不然也不会一直不解决。


更多相关文章

  1. android 基础代码 备忘
  2. Android唤醒、解锁屏幕代码实例
  3. Android:android.git.kernel.org 无法访问时下载源代码的解决方法
  4. [Tools]Android Studio代码提示功能--Ctrl+Alt+Space(空格键)
  5. Android学习心得(14) --- Android代码混淆(2)
  6. 一网打尽__Android 开源代码合集(SwitchButton)
  7. DSBridge——一套H5代码就能同时与Android和iOS通信

随机推荐

  1. 如何修改音乐的匹配字数
  2. android ERROR: unknown virtual device
  3. android intent和intent action大全
  4. Android中ClassLoader类加载机制
  5. android.mk 与 makefile文件的区别
  6. Android多点触控开发原理
  7. [转]Android的Handler总结
  8. Android(安卓)判断用户2G/3G/4G移动数据
  9. uckDuckGo 将成为欧盟 Android(安卓)设备
  10. Android中Cursor关闭的问题