Files
PrinceOfGlory/Assets/Editor/ShirakaTools/Change_Shader.cs
kridoo 6e91a0c7f0 111
2025-09-15 17:32:08 +08:00

84 lines
2.3 KiB
C#

using UnityEngine;
using UnityEditor;
using System.Collections.Generic;
using System.IO;
/**
这是替换全局材质shader的脚本不要删
Default Lit在Package/Universal RP下面
By:Shiraka
**/
public class ChangeShaderTool : EditorWindow
{
private Shader sourceShader;
private Shader targetShader;
private List<Material> materialsToChange = new List<Material>();
[MenuItem("Tools/ShirakaTool/Change Shader Tool")]
public static void ShowWindow()
{
GetWindow<ChangeShaderTool>("Change Shader Tool");
}
private void OnGUI()
{
GUILayout.Label("批量替换 Shader 工具", EditorStyles.boldLabel);
sourceShader = EditorGUILayout.ObjectField("原始 Shader", sourceShader, typeof(Shader), false) as Shader;
targetShader = EditorGUILayout.ObjectField("目标 Shader", targetShader, typeof(Shader), false) as Shader;
if (GUILayout.Button("查找使用源 Shader 的材质"))
{
FindMaterialsUsingSourceShader();
}
if (materialsToChange.Count > 0)
{
GUILayout.Label($"找到 {materialsToChange.Count} 个材质使用了源 Shader。", EditorStyles.label);
if (GUILayout.Button("执行替换"))
{
ReplaceShaders();
}
}
}
private void FindMaterialsUsingSourceShader()
{
materialsToChange.Clear();
string[] materialGuids = AssetDatabase.FindAssets("t:Material");
foreach (string guid in materialGuids)
{
string path = AssetDatabase.GUIDToAssetPath(guid);
Material mat = AssetDatabase.LoadAssetAtPath<Material>(path);
if (mat != null && mat.shader == sourceShader)
{
materialsToChange.Add(mat);
}
}
Debug.Log($"找到 {materialsToChange.Count} 个材质使用了源 Shader。");
}
private void ReplaceShaders()
{
if (targetShader == null)
{
Debug.LogError("请指定目标 Shader。");
return;
}
foreach (Material mat in materialsToChange)
{
Undo.RecordObject(mat, "Change Shader");
mat.shader = targetShader;
EditorUtility.SetDirty(mat);
}
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
Debug.Log("Shader 替换完成。");
}
}