有时我们需要批量替换材质球的Shader, 下面我写了个工具
using UnityEditor;
using UnityEngine;
public class MaterialShaderModifier : EditorWindow
{
private string folderPath = "Assets";
private string ShaderName = "";
private Shader newShader;
[MenuItem("Tools/Material Shader Modifier")]
private static void ShowWindow()
{
GetWindow<MaterialShaderModifier>("Material Shader Modifier");
}
private void OnGUI()
{
GUILayout.Label("Folder Path", EditorStyles.boldLabel);
folderPath = EditorGUILayout.TextField(folderPath);
GUILayout.Space(10);
GUILayout.Label("Property Name", EditorStyles.boldLabel);
ShaderName = EditorGUILayout.TextField(ShaderName);
GUILayout.Space(10);
GUILayout.Label("New Shader", EditorStyles.boldLabel);
newShader = EditorGUILayout.ObjectField(newShader, typeof(Shader), true) as Shader;
GUILayout.Space(10);
if (GUILayout.Button("Modify Shaders"))
{
ModifyShaders();
}
}
private void ModifyShaders()
{
string[] materialPaths = AssetDatabase.FindAssets("t:Material", new[] {
folderPath });
foreach (string materialPath in materialPaths)
{
Material material = AssetDatabase.LoadAssetAtPath<Material>(AssetDatabase.GUIDToAssetPath(materialPath));
Undo.RecordObject(material, "Modified Shader");
if(material.shader.name== ShaderName)
{
material.shader = newShader;
}
}
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
}
}
菜单栏–Tools–MaterialShaderModifier 打开工具面板
FolderPath:文件夹路径,
PropertyName:当前材质球的shader名字
NewShader;要替换的shader
ModifyShaders;确认替换按钮