Unity游戏开发过程中,在UnityEditor下,我们通常直接使用游戏资产(lua代码,prefab,图片,材质等)。而游戏发布后则通常资产导出为AssetBundle以给游戏使用。
Unity会为不同的平台(android,ios,windows)生成不同的AssetBundle,如果我们在UnityEditor下面直接使用为android或者ios平台生成的AssetBundle通常会表现为粉色(shader渲染失败),其原因就是Android平台上编译好的shader(OpenGLES3、Vulkan),在Windows(Direct3D11,)下不支持。
解决方式1:Windows平台的Graphic APIs的第一个修改为OpenGLES3,并重启编辑器,重启后Shader丢失(变粉)的问题得到解决,但某些Unity版本(2021.1.24f1)的Inspector面板出现bug
操作方法如下图
文章来源:https://www.toymoban.com/news/detail-543510.html
解决方式2:AssetBundle加载完成后,替换其中的shader代码如下:
但是这种方式也有一些问题,变现为某些带有变体的shader的效果差异。
如我这边碰到的一个问题,本来是在透明层渲染的shader,确在不透明层渲染了,在Hierarchy面板下找到这个物体,然后再Inspector面板下展开材质的参数,回到了透明层渲染。
_loaderData.assetObject = _assetBundleRequest.asset;
AssetUtil.Editor_ReplaceShader(_loaderData.assetObject as GameObject);
[System.Diagnostics.Conditional("UNITY_EDITOR")]
public static void Editor_ReplaceShader(GameObject go)
{
if (go == null)
{
return;
}
Renderer[] renderers = go.GetComponentsInChildren<Renderer>(true);
foreach (var renderer in renderers)
{
UnityEngine.Material[] matArr = renderer.sharedMaterials;
foreach (var mat in matArr)
{
Editor_ReplaceShader(mat, go.name);
}
}
}
[System.Diagnostics.Conditional("UNITY_EDITOR")]
public static void Editor_ReplaceShader(Material mat, string gameObjectName = null)
{
if (mat != null && mat.shader != null)
{
Shader shader = Shader.Find(mat.shader.name);
if (shader != null)
{
mat.shader = shader;
}
else
{
UnityEngine.Debug.LogError($"can't find the shader material={mat}, gameObject={gameObjectName}, shader={mat.shader.name}");
}
}
}
文章来源地址https://www.toymoban.com/news/detail-543510.html
到了这里,关于UnityEditor加载AssetBundle模型变为粉色的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!