在Unity中,当我从服务器加载Assetbundle时,它的材质都是正确的,但是对象变成了粉红色。知道怎么解决这个问题吗?
发布于 2022-01-20 13:21:02
这些材料可能只在编辑器中显示为粉红色。它在建造中应该工作得很好。
然而,看到游戏屏幕上到处都是粉红色会让人非常讨厌。您可以使用下面的脚本在编辑器中修复此问题。
using TMPro;
using UnityEngine;
using UnityEngine.UI;
#if UNITY_EDITOR
public static class AssetBundleEditorUtil
{
public static void FixShadersForEditor(GameObject prefab)
{
var renderers = prefab.GetComponentsInChildren<Renderer>(true);
foreach (var renderer in renderers)
{
ReplaceShaderForEditor(renderer.sharedMaterials);
}
var tmps = prefab.GetComponentsInChildren<TextMeshProUGUI>(true);
foreach (var tmp in tmps)
{
ReplaceShaderForEditor(tmp.material);
ReplaceShaderForEditor(tmp.materialForRendering);
}
var spritesRenderers = prefab.GetComponentsInChildren<SpriteRenderer>(true);
foreach (var spriteRenderer in spritesRenderers)
{
ReplaceShaderForEditor(spriteRenderer.sharedMaterials);
}
var images = prefab.GetComponentsInChildren<Image>(true);
foreach (var image in images)
{
ReplaceShaderForEditor(image.material);
}
var particleSystemRenderers = prefab.GetComponentsInChildren<ParticleSystemRenderer>(true);
foreach (var particleSystemRenderer in particleSystemRenderers)
{
ReplaceShaderForEditor(particleSystemRenderer.sharedMaterials);
}
var particles = prefab.GetComponentsInChildren<ParticleSystem>(true);
foreach (var particle in particles)
{
var renderer = particle.GetComponent<Renderer>();
if (renderer != null) ReplaceShaderForEditor(renderer.sharedMaterials);
}
}
public static void ReplaceShaderForEditor(Material[] materials)
{
for (int i = 0; i < materials.Length; i++)
{
ReplaceShaderForEditor(materials[i]);
}
}
public static void ReplaceShaderForEditor(Material material)
{
if (material == null) return;
var shaderName = material.shader.name;
var shader = Shader.Find(shaderName);
if (shader != null) material.shader = shader;
}
}
#endifhttps://stackoverflow.com/questions/70741369
复制相似问题