Unity 编辑器环境下不能正确加载Android Assetbundle 中的 Shader 解决方法
2017-06-30 16:49
666 查看
版权声明:本文转自http://blog.csdn.net/huutu 转载请带上 http://www.thisisgame.com.cn
今天老大发现 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
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 论坛找到相关的帖子。
[html] view
plain copy
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
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
UnityEditor 的确是没有正确从Assetbundle 中加载出来 Shader ,上面代码里面重新给Material 赋值一次,其实是 读取到了 没有被打成Assetbundle 的Shader 。
我们把Asset 里面的 Shader 源文件删掉,上面的代码也无能为力了。( 下图中我把 NesShader 删掉了 )
查看编译之后的Shader代码,发现Unity在把Shader打包到对应的平台的时候,可能没有考虑到这个Shader会在编辑器下面运行。所以只把Shader打包到单个平台并且执行。
其实可以在判断当前是在编辑器下不要执行 Assetbundle中的Shader,使用原来的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
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 论坛找到相关的帖子。
[html] view
plain copy
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
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
UnityEditor 的确是没有正确从Assetbundle 中加载出来 Shader ,上面代码里面重新给Material 赋值一次,其实是 读取到了 没有被打成Assetbundle 的Shader 。
我们把Asset 里面的 Shader 源文件删掉,上面的代码也无能为力了。( 下图中我把 NesShader 删掉了 )
查看编译之后的Shader代码,发现Unity在把Shader打包到对应的平台的时候,可能没有考虑到这个Shader会在编辑器下面运行。所以只把Shader打包到单个平台并且执行。
其实可以在判断当前是在编辑器下不要执行 Assetbundle中的Shader,使用原来的Shader 就好。不过这也不是很大的问题,不然也不会一直不解决。
相关文章推荐
- Unity 编辑器环境下不能正确加载Android Assetbundle 中的 Shader 解决方法
- Unity 编辑器环境下不能正确加载Android Assetbundle 中的 Shader
- 关于unity 中使用AssetBundle加载资源,shader偶尔会丢失的问题解决办法
- andorid 解压zip文件、android中文文件存放问题、asset里不能放中文名文件的解决方法、用File读asset的路径的问题、把asset的文件写入机器
- Unity加载AssetBundle后shader丢失问题
- 关于Android不能正确发送User-Agent的解决方法
- Unity Assetbundle shader(丢失)不正确显示的问题
- Unity AssetBundle加载错误(已解决)
- VS2010不能正确加载 'VSTS for Database Professionals Sql Server Data-tier Application'包解决方法
- 页面在IDEA项目目录不能正确加载css/js等文件的解决方法
- Unity3D在移动平台下加载AssetBundle导致Shader效果不正确的问题
- 解决android adb不能正确加载问题
- 解决Unity 中WWW加载 AssetBundle---中文路径
- 【Unity3d】关于AssetBundle.CreateFromFile()方法加载资源失败解决方法
- unity 关于assetbundle 打包和加载的方法
- Unity最新版打包AssetBundle和加载的方法
- 关于采用Unity 5.x 提供的增量式打包单个模型后AssetBundle doesn’t have main asset解决方法
- 解决Unity 中WWW加载 AssetBundle---中文路径
- android bundle putSerializable 保存当前acitvity时候抛出IOException的解决方法
- AIX下用su切换用户时不能加载环境变量的问题解决