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

今天老大发现 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
  1. Shader "Custom/NewShader" {  
  2.     Properties  
  3.     {  
  4.         _MainTex ("Texture", 2D) = "white" {}  
  5.     }  
  6.     SubShader  
  7.     {  
  8.         Tags { "RenderType"="Opaque" }  
  9.         LOD 100  
  10.   
  11.         Pass  
  12.         {  
  13.             CGPROGRAM  
  14.             #pragma vertex vert  
  15.             #pragma fragment frag  
  16.             // make fog work  
  17.             //#pragma multi_compile_fog  
  18.               
  19.             #include "UnityCG.cginc"  
  20.   
  21.             struct appdata  
  22.             {  
  23.                 float4 vertex : POSITION;  
  24.                 float2 uv : TEXCOORD0;  
  25.             };  
  26.   
  27.             struct v2f  
  28.             {  
  29.                 float2 uv : TEXCOORD0;  
  30.                 //UNITY_FOG_COORDS(1)  
  31.                 float4 vertex : SV_POSITION;  
  32.             };  
  33.   
  34.             sampler2D _MainTex;  
  35.             float4 _MainTex_ST;  
  36.               
  37.             v2f vert (appdata v)  
  38.             {  
  39.                 v2f o;  
  40.                 o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);  
  41.                 o.uv = TRANSFORM_TEX(v.uv, _MainTex);  
  42.                 //UNITY_TRANSFER_FOG(o,o.vertex);  
  43.                 return o;  
  44.             }  
  45.               
  46.             fixed4 frag (v2f i) : SV_Target  
  47.             {  
  48.                 // sample the texture  
  49.                 fixed4 col = tex2D(_MainTex, i.uv);  
  50.                 // apply fog  
  51.                 //UNITY_APPLY_FOG(i.fogCoord, col);  
  52.                 return col;  
  53.             }  
  54.             ENDCG  
  55.         }  
  56.     }  
  57. }  

然而还是一样的。


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

[html]  view plain  copy
  1. 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
  1. if (GUILayout.Button("Load Cube"))  
  2. {  
  3.     AssetBundle assetbundle = AssetBundle.CreateFromFile(Application.dataPath + "/bundleNoLZMA/Cube.prefab.unity3d");  
  4. #if UNITY_EDITOR  
  5.     var materials = assetbundle.LoadAll(typeof(Material));  
  6.     foreach (Material m in materials)  
  7.     {  
  8.         var shaderName = m.shader.name;  
  9.   
  10.         var newShader = Shader.Find(shaderName);  
  11.         if (newShader != null)  
  12.         {  
  13.             m.shader = newShader;  
  14.         }  
  15.         else  
  16.         {  
  17.             Debug.LogWarning("unable to refresh shader: " + shaderName + " in material " + m.name);  
  18.         }  
  19.     }  
  20. #endif  
  21.     Instantiate(assetbundle.mainAsset);  
  22. }  
文章转自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 就好。不过这也不是很大的问题,不然也不会一直不解决。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值