Unity 批量更换材质球脚本

使用方法:

将脚本复制到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();
    }
}

### 如何在 Unity 中创建和使用材质Unity 中,材质(Material)是用于定义物体外观的核心资源之一。它结合了着色器(Shader)和纹理(Texture),以实现不同的视觉效果。以下是关于如何创建和使用材质的详细说明。 #### 创建材质 1. 在 Unity 的项目窗口中,右键单击空白区域,选择 **Create > Material**[^3]。 2. 这将生成一个新的材质,默认名称为“New Material”。可以双击或在检视窗口中重命名材质。 3. 在检视窗口中,可以选择材质使用的着色器(Shader)。Unity 提供了许多内置着色器,例如 Standard、Unlit、以及自定义着色器[^3]。 4. 根据所选着色器的不同,可以调整材质属性,如颜色(Color)、主纹理(Albedo)、法线贴图(Normal Map)等[^3]。 #### 动态创建材质 如果需要通过脚本动态创建材质,可以使用以下代码示例: ```csharp using UnityEngine; public class CreateMaterialExample : MonoBehaviour { void Start() { // 创建一个新的材质 Material newMaterial = new Material(Shader.Find("Standard")); // 使用 Standard 着色器 // 设置材质的颜色 newMaterial.color = Color.red; // 将材质应用到当前游戏对象的渲染器上 Renderer renderer = GetComponent<Renderer>(); if (renderer != null) { renderer.material = newMaterial; } } } ``` 上述代码展示了如何通过脚本动态创建材质,并将其应用于模型的渲染器上[^2]。 #### 材质变体 在某些情况下,可能需要基于现有材质创建变体。这可以通过拖拽操作实现。例如,将一个材质拖拽到另一个材质上,会生成一个材质变体。材质变体的功能类似于预制体变体,允许对父材质进行继承和修改[^1]。 #### 取消材质变体 如果误操作生成了材质变体,可以按照以下步骤取消: 1. 选中目标材质变体。 2. 在检视窗口中,点击 **Edit** 下拉菜单。 3. 选择 **Material**,即可将材质变体切回普通材质[^1]。 #### 使用材质 1. 将创建好的材质从项目窗口拖拽到场景中的模型上,或者直接拖拽到模型的渲染器组件中。 2. 如果需要批量应用材质,可以在检视窗口中选择多个模型,然后统一设置材质。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值