使用方法:
将脚本复制到assets里的editor文件夹,没有的话创建一个就行。
1、全选所有材质球
2、在tools里选中目标的材质球
3、选择change,可以撤回
using UnityEngine;
using UnityEditor;
using System.Collections.Generic;
public class MaterialBatchChanger : EditorWindow
{
private Material newMaterial; // 新材质
private List<Renderer> targetRenderers = new List<Renderer>(); // 存储目标物体的Renderer组件
private List<Material[]> originalMaterials = new List<Material[]>(); // 用于撤回的原始材质数组
[MenuItem("Tools/Batch Material Changer")]
public static void ShowWindow()
{
GetWindow<MaterialBatchChanger>("Batch Material Changer");
}
private void OnGUI()
{
// 显示材质选择器
newMaterial = (Material)EditorGUILayout.ObjectField("New Material", newMaterial, typeof(Material), false);
if (GUILayout.Button("Change Materials"))
{
ChangeMaterials();
}
if (GUILayout.Button("Undo Change"))
{
UndoChange();
}
}
private void ChangeMaterials()
{
if (newMaterial == null)
{
Debug.LogWarning("Please select a material to change to.");
return;
}
// 获取所有选中的物体
GameObject[] selectedObjects = Selection.gameObjects;
originalMaterials.Clear(); // 清空撤回列表
foreach (GameObject obj in selectedObjects)
{
Renderer renderer = obj.GetComponent<Renderer>();
if (renderer != null)
{
targetRenderers.Add(renderer);
// 存储原始材质
originalMaterials.Add(renderer.sharedMaterials);
// 更换材质
Material[] newMaterials = new Material[renderer.sharedMaterials.Length];
for (int i = 0; i < newMaterials.Length; i++)
{
newMaterials[i] = newMaterial;
}
renderer.sharedMaterials = newMaterials;
}
}
}
private void UndoChange()
{
if (targetRenderers.Count == 0 || originalMaterials.Count == 0)
{
Debug.LogWarning("No materials to undo.");
return;
}
for (int i = 0; i < targetRenderers.Count; i++)
{
if (targetRenderers[i] != null)
{
// 恢复到原始材质
targetRenderers[i].sharedMaterials = originalMaterials[i];
}
}
// 清空已存的Renderer和材质数据
targetRenderers.Clear();
originalMaterials.Clear();
}
}