当前位置: 首页 > news >正文

Unity 编辑器扩展 一键替换指定物体下的所有材质球

先看效果

实现方案

1:创建几个用于测试的Cube

2:创建一个脚本

3:编写脚本内容

主要是这部分的逻辑

附上完整代码

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;public class Tool
{[MenuItem("TOOL/ReplaceMaterial")]public static void Open(){var window = EditorWindow.GetWindow(typeof(ReplaceMA));window.title = "材质球替换工具";}
}
public class ReplaceMA : EditorWindow
{private GameObject _GameObject;private Material _Material;private void OnGUI(){if (!Application.isPlaying){GUILayout.Label("拖入一个你想替换材质球的游戏物体");_GameObject = (GameObject)EditorGUILayout.ObjectField(_GameObject, typeof(GameObject), true);GUILayout.Label("拖入一个你想替换的材质球");_Material = (Material)EditorGUILayout.ObjectField(_Material, typeof(Material), true);if (GUILayout.Button("点击替换")){if (_GameObject == null || _Material == null){Debug.LogError("你要替换材质的游戏物体或者材质球为空");return;}var RenderList = new List<Renderer>();RenderList.Add(_GameObject.gameObject.GetComponent<Renderer>());RenderList.AddRange(_GameObject.GetComponentsInChildren<Renderer>());Undo.RecordObjects(RenderList.ToArray(), "Replace");//这句话非常重要,不然得气死个人!!!foreach (var item in RenderList){var materials = item.sharedMaterials;for (int i = 0; i < materials.Length; i++){materials[i] = _Material;}item.sharedMaterials = materials;}}}}
}

4,然后就完成啦,同样你也可以按照我的思路再扩展扩展,可以替换你自己想要的内容

相关文章:

  • Android14 WMS-窗口绘制之relayoutWindow流程(一)-Client端
  • Java学习-JDBC(一)
  • 【数据结构】图论入门
  • 开发常用软件
  • PDF编辑与转换的终极工具智能PDF处理Acrobat Pro DC
  • Day14:响应式网页
  • java 原生http服务器 测试JS前端ajax访问实现跨域传post数据
  • 【Python爬虫单点登录实战】PyExecJS破解慧职教:过河源技术学院单点登录统一身份认证
  • 电脑开机出现英文字母,如何解决这个常见问题?
  • MAVEN:自定义模板Archetype的创建
  • 【java】速度搭建一个springboot项目
  • 计算机网络--应用层
  • BF16相比FP16的优点
  • alist配合onlyoffice 实现在线预览
  • 达梦数据库
  • angular2开源库收集
  • JavaScript设计模式之工厂模式
  • js中的正则表达式入门
  • leetcode386. Lexicographical Numbers
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • Terraform入门 - 3. 变更基础设施
  • Web设计流程优化:网页效果图设计新思路
  • windows-nginx-https-本地配置
  • 你真的知道 == 和 equals 的区别吗?
  • 前端面试之CSS3新特性
  • 前嗅ForeSpider教程:创建模板
  • 前嗅ForeSpider中数据浏览界面介绍
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 做一名精致的JavaScripter 01:JavaScript简介
  • # .NET Framework中使用命名管道进行进程间通信
  • ###项目技术发展史
  • #pragma once与条件编译
  • #大学#套接字
  • (152)时序收敛--->(02)时序收敛二
  • (Git) gitignore基础使用
  • (k8s)kubernetes集群基于Containerd部署
  • (STM32笔记)九、RCC时钟树与时钟 第二部分
  • (笔记)M1使用hombrew安装qemu
  • (二)原生js案例之数码时钟计时
  • (二十六)Java 数据结构
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (四)React组件、useState、组件样式
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (四)软件性能测试
  • (杂交版)植物大战僵尸
  • (转)VC++中ondraw在什么时候调用的
  • (转)大道至简,职场上做人做事做管理
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .net web项目 调用webService
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .net分布式压力测试工具(Beetle.DT)
  • [ C++ ] STL---仿函数与priority_queue