今天老大发现 UnityEditor 在 Android 下打出来的 android 的 Assetbundle,加载之后 Shader 不能正确的执行!!!
文章转自http://blog.csdn.NET/huutu http://www.thisisgame.com.cn
![](https://img-blog.csdn.net/20160120221627471?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
查看 Shader 属性,看到 提示 说 该 Shader 不支持我的显卡
![](https://img-blog.csdn.net/20160120221656588?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
文章转自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
-
-
-
- #include "UnityCG.cginc"
-
- struct appdata
- {
- float4 vertex : POSITION;
- float2 uv : TEXCOORD0;
- };
-
- struct v2f
- {
- float2 uv : TEXCOORD0;
-
- 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);
-
- return o;
- }
-
- fixed4 frag (v2f i) : SV_Target
- {
-
- fixed4 col = tex2D(_MainTex, i.uv);
-
-
- 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_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
![](https://img-blog.csdn.net/20160120222636537?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
UnityEditor 的确是没有正确从Assetbundle 中加载出来 Shader ,上面代码里面重新给Material 赋值一次,其实是 读取到了 没有被打成Assetbundle 的Shader 。
我们把Asset 里面的 Shader 源文件删掉,上面的代码也无能为力了。( 下图中我把 NesShader 删掉了 )
![](https://img-blog.csdn.net/20160120222653865?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
查看编译之后的Shader代码,发现Unity在把Shader打包到对应的平台的时候,可能没有考虑到这个Shader会在编辑器下面运行。所以只把Shader打包到单个平台并且执行。
其实可以在判断当前是在编辑器下不要执行 Assetbundle中的Shader,使用原来的Shader 就好。不过这也不是很大的问题,不然也不会一直不解决。
![](https://img-blog.csdn.net/20160121125134639?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)