2025-06-03 02:42:28 -04:00
|
|
|
|
using System.Collections;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
|
|
|
|
public static class ShaderExtension
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 对于从AssetBundle中加载的材质,修改Shader参数可能会出现异常情况。
|
|
|
|
|
|
/// 此时需要在生成物体的时候,重新初始化Shader。
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public static void InitializeShader(this Renderer renderer)
|
|
|
|
|
|
{
|
2026-03-14 03:13:10 -04:00
|
|
|
|
// 关键改动:使用 sharedMaterials
|
|
|
|
|
|
Material[] sharedMats = renderer.sharedMaterials;
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var material in sharedMats)
|
2025-06-03 02:42:28 -04:00
|
|
|
|
{
|
2026-03-14 03:13:10 -04:00
|
|
|
|
if (material == null) continue;
|
|
|
|
|
|
|
2025-06-03 02:42:28 -04:00
|
|
|
|
string shaderName = material.shader.name;
|
|
|
|
|
|
Shader shader = Shader.Find(shaderName);
|
|
|
|
|
|
|
|
|
|
|
|
if (shader != null)
|
|
|
|
|
|
{
|
2026-03-14 03:13:10 -04:00
|
|
|
|
// 只有当 Shader 真的不一致时才重新赋值,节省性能开销
|
|
|
|
|
|
if (material.shader != shader)
|
|
|
|
|
|
{
|
|
|
|
|
|
material.shader = shader;
|
|
|
|
|
|
}
|
2025-06-03 02:42:28 -04:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
Debug.LogWarning($"Shader '{shaderName}' not found for material '{material.name}' on renderer '{renderer.name}'.");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-03-14 03:13:10 -04:00
|
|
|
|
|
|
|
|
|
|
/*foreach (Material material in renderer.materials)
|
|
|
|
|
|
{
|
|
|
|
|
|
string shaderName = material.shader.name;
|
|
|
|
|
|
Shader shader = Shader.Find(shaderName);
|
|
|
|
|
|
|
|
|
|
|
|
if (shader != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
material.shader = shader;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
Debug.LogWarning($"Shader '{shaderName}' not found for material '{material.name}' on renderer '{renderer.name}'.");
|
|
|
|
|
|
}
|
|
|
|
|
|
}*/
|
2025-06-03 02:42:28 -04:00
|
|
|
|
}
|
|
|
|
|
|
}
|