首页 > 系统 > Android > 正文

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

2019-11-09 17:29:38
字体:
来源:转载
供稿:网友

今天老大发现 UnityEditor 在 Android 下打出来的 Android 的 Assetbundle,加载之后 Shader 不能正确的执行!!!

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

但是仔细看 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_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);}

测试Ok

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

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

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

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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表