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 materialsToChange = new List(); [MenuItem("Tools/ShirakaTool/Change Shader Tool")] public static void ShowWindow() { GetWindow("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(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 替换完成。"); } }