Unity编辑器实现对选中物体一键替换材质

这篇具有很好参考价值的文章主要介绍了Unity编辑器实现对选中物体一键替换材质。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

说明

       最近美术同事在整理模型动画时有一个需求,就是选中部分的模型一件将材质替换成同一个材质球。在编辑器下将这个功能实现了出来。代码放在最后,简单记录一下。

思路

  1. 首先对选中进行遍历,拿到所有的子对象;
  2. 对每个具体的对象拿到对应的Mesh Renderer组件;
  3. 对每个MeshRender组件中的Materials进行判断,判断是否有材质,材质是否有多个的情况;
  4. 在替换成功后支持回退的功能;

效果

       这里是在Transform组件中调出对应的方法,因为有可能选中的物体没有MeshRenderer组件。支持选中多个物体。
unity怎么替换素材,Unity问题记录,unity,编辑器,材质
unity怎么替换素材,Unity问题记录,unity,编辑器,材质文章来源地址https://www.toymoban.com/news/detail-544805.html

代码

using System.Collections.Generic;
using UnityEditor;
using UnityEngine;


public class HK_ReplaceMaterial : Editor
{
    [MenuItem("CONTEXT/Transform/ReplaceMaterial")]
    static void MaterialReplacing()
    {
        MaterialReplacingEditorPanel.ShowReplaceMaterials();
    }
}

public class MaterialReplacingEditorPanel : EditorWindow
{   
    //要替换的材质
    Material _material;
   
    public static void ShowReplaceMaterials()
    {
        EditorWindow ReplaceMaterialsWindow = GetWindow<MaterialReplacingEditorPanel>("ReplaceMaterials");
        ReplaceMaterialsWindow.Show();
    }

    private void OnGUI()
    {
        GUILayout.Space(10);

        GUILayout.BeginHorizontal();
        GUILayout.Label("材质替换", GUILayout.Width(100f));
        _material = EditorGUILayout.ObjectField(_material, typeof(Material), true) as Material;
        GUILayout.EndHorizontal();

        GUILayout.Space(10);

        if (GUILayout.Button("替换"))
        {
            var selectionObjs = Selection.gameObjects;

            if (_material == null)
            {
                EditorUtility.DisplayDialog("提醒", string.Format("当前没有选择任何材质"), "确定");
            }
            else if (selectionObjs.Length == 0)
            {
                EditorUtility.DisplayDialog("提醒", string.Format("当前没有选中物体"), "确定");
        }
            else if (EditorUtility.DisplayDialog("提醒", string.Format("是否将当前选中的物体全部替换材质?", _material.name), "确定", "取消"))
            {
                for (int i = 0; i < selectionObjs.Length; i++)
                {
                    TraverseChild(selectionObjs[i]);
                }
            }
        }
    }

    void TraverseChild(GameObject thisObject)
    {
        //回退
        List<Object> obj = new List<Object>();

        for (int i = 0; i < thisObject.GetComponentsInChildren<Renderer>(true).Length; i++)
        {
            if (thisObject == null)
                continue;

            else if (thisObject.GetComponentsInChildren<Renderer>(true)[i] == null)
                continue;
            else if (thisObject.GetComponentsInChildren<Renderer>(true)[i].sharedMaterial == null)
                continue;

            obj.Add(thisObject.GetComponentsInChildren<Renderer>(true)[i]);
        }

        Undo.RecordObjects(obj.ToArray(), "ds");

        for (int i = 0; i < thisObject.GetComponentsInChildren<Renderer>(true).Length; i++)
        {
            if (thisObject == null)
                continue;
            else if (thisObject.GetComponentsInChildren<Renderer>(true)[i] == null)
                continue;
            
            else if (thisObject.GetComponentsInChildren<Renderer>(true)[i].sharedMaterial == null)
                continue;
            
            List<Material> materials = new List<Material>();

            foreach (var j in thisObject.GetComponentsInChildren<Renderer>(true)[i].sharedMaterials)
            {
                materials.Add(_material);
            }

            thisObject.GetComponentsInChildren<Renderer>(true)[i].sharedMaterials = materials.ToArray();
        }
    }
}

到了这里,关于Unity编辑器实现对选中物体一键替换材质的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • threejs(6)-操控物体实现家居编辑器

    2024年02月07日
    浏览(137)
  • 【Unity编辑器扩展】(三)PSD转UGUI Prefab, 一键拼UI解放美术/程序(完结)

    解放UI程序/美术? psd文件一键转ui prefab 支持所有ui类型 支持textmeshpro psd一键转ugui prefab工具 设计原理和详细使用方法 第一步,把psd图层转换为可编辑的节点树,并自动解析UI类型、自动绑定UI子元素:  第二步, 点击“生成UIForm\\\"按钮生成UI预制体 (若有UI类型遗漏可在下拉菜单

    2024年02月13日
    浏览(39)
  • 突破编程_前端_ACE编辑器(选中区域、跳转行以及点击事件)

    要在 ACE 编辑器中选中一个区域,通常需要使用编辑器的 selection 对象。 以下是一个简单的示例,展示了如何使用 ACE 编辑器的 API 来选中一个特定的区域: 初始化 ACE 编辑器:首先,需要在页面上初始化 ACE 编辑器(在“突破编程_前端_ACE编辑器(概述)”有具体说明)。 获

    2024年04月10日
    浏览(49)
  • 记录使用注入的方式为Unity编辑器实现扩展能力

    使用场景 当前项目编辑器中不方便存放或者提交扩展代码 相同的扩展功能需要在多个项目(编辑器)中使用 项目开发中,偶尔临时需要使用一个功能,想随时使用随时卸载 设计思路 使用进程注入,将一个 c/c++ dll 注入到当前运行的unity编辑器中 使用 c/c++ dll 调用 mono 的函数接

    2024年02月15日
    浏览(49)
  • unity 简单实现tilemap的保存和读取(以便用于关卡编辑器)

            最近在学习使用Tiledmap,用于制作地图确实很方便快捷,但总不能一个关卡就做一个prefab?还是必须将其保存为文本文件才行啊,于是有了以下的尝试:         先定义一个Tiledmap类,用于存储单个Tiledmap信息 tiles是保存的所有tile块。key为坐标值,value为使用的tile

    2024年02月13日
    浏览(37)
  • 一键切割,激发无限创意:体验全新图片批量编辑器

    在数字创意的时代,图片编辑成为了表达个性和创造力的关键。然而,传统的图片编辑工具常常让人望而生畏,复杂的操作和高门槛的技术要求使得许多人望而却步。现在,我们为您带来一款全新的图片批量编辑器,只需一键切割,就能释放您无限的创意火花! “图片批量编

    2024年03月18日
    浏览(54)
  • unity 通过 二维数组序列化 实现二维数组在编辑器面板查看和配置数据

    实现思路如下: 1、定义一个二维数组数据类 2、奖数据类标记为 Serializable  并实现 unity内置的  ISerializationCallbackReceiver接口,接口提供了序列化和反序列化方法,参见官方文档(文档中给出了字典的序列化方法):Unity - Scripting API: ISerializationCallbackReceiver 3、使用unity序列化

    2024年02月08日
    浏览(44)
  • Unity编辑器扩展 | 编辑器扩展基础入门

    前言 当谈到游戏开发工具,Unity编辑器是一个备受赞誉的平台。它为开发者提供了一个强大且灵活的环境,使他们能够创建令人惊叹的游戏和交互式体验。 然而,Unity编辑器本身也是可以扩展和定制的,这为开发者提供了进一步提升工作流程和增强功能的机会。 在Unity 编辑器

    2024年02月10日
    浏览(77)
  • 【Unity编辑器扩展】 | 编辑器扩展入门基础

    前言 当谈到游戏开发工具,Unity编辑器是一个备受赞誉的平台。它为开发者提供了一个强大且灵活的环境,使他们能够创建令人惊叹的游戏和交互式体验。 然而,Unity编辑器本身也是可以扩展和定制的,这为开发者提供了进一步提升工作流程和增强功能的机会。 在Unity 编辑器

    2024年02月10日
    浏览(84)
  • Unity 可视化节点编辑器(GraphView、编辑器扩展)

      前几天把导师的项目打包发布交了一稿,这半个星期除了再把项目缝缝补补外(说实话项目做到后边实在有些无聊,都是些琐碎的东西而且自己也学不到什么,纯粹是 浪费 消磨时间)无聊逛Unity商店发现了个有意思的东西,说实话一开始我以为只是单纯绘制的2D动画:

    2024年02月12日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包