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

本文解决了一个Unity在Android环境下从Assetbundle加载Shader时遇到的问题。通过重新加载Material中的Shader,修复了无法正常执行的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


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

但是仔细看 Shader 也没什么问题,于是到官网找了一个最简单的Shader 来替换

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

然而还是一样的。

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

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

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

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

  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. var newShader = Shader.Find(shaderName);
  10. if (newShader != null)
  11. {
  12. m.shader = newShader;
  13. }
  14. else
  15. {
  16. Debug.LogWarning("unable to refresh shader: " + shaderName + " in material " + m.name);
  17. }
  18. }
  19. #endif
  20. Instantiate(assetbundle.mainAsset);
  21. }

测试Ok

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值