Unity插件扩展中组件常用的几个方法
最近为美术编写一个Unity编辑器的扩展,主要为了减轻美术在修改预制对象时的机械化操作的繁琐和出错。具体实现的几个功能:
1、删除指定组件;
2、复制、粘贴指定的组件;
3、重新关联新的属性;
4、重新保存预制对象;
一、删除指定类型的组件
public static void RemoveComponentHandler(GameObject gameObject, Type componentType){foreach (var component in gameObject.GetComponents<Component>()){if (component.GetType() == componentType){GameObject.DestroyImmediate(component);}} }
二、复制组件(这里实现的是一次仅复制一个某类型的组件)
public static void CopyComponentHandler(Type componentType, GameObject fromGameObject, GameObject toGameObject){RemoveComponentHandler(toGameObject, componentType);// 查找需要复制的 ComponentComponent needCopyComponent = null;foreach (var component in fromGameObject.GetComponents<Component>()){if (component.GetType() == componentType){needCopyComponent = component;break;}}// 进行粘贴操作// http://answers.unity3d.com/questions/907294/copy-all-components-from-a-gameobject-and-paste-to.html UnityEditorInternal.ComponentUtility.CopyComponent(needCopyComponent);UnityEditorInternal.ComponentUtility.PasteComponentAsNew(toGameObject);}
三、关联新属性
就是遍历指定的GameObject,然后找到它附加的组件,重新设置其值即可。
四、替换预制对象
GameObject activeGameObject = Selection.activeGameObject; if (activeGameObject != null) {// 获取当前的idif (new Regex(@"^\d+h$").IsMatch(activeGameObject.name)){UnityEngine.Object parentObject = null;string strPrefabPath = "";if (PrefabUtility.GetPrefabType(activeGameObject) == PrefabType.PrefabInstance){parentObject = EditorUtility.GetPrefabParent(activeGameObject);strPrefabPath = AssetDatabase.GetAssetPath(parentObject);}// 查找idstring strId = new Regex(@"h$").Replace(activeGameObject.name, "");// 第六步 保存预制对象string strCurrSelectPrefabName = activeGameObject.name;if (strPrefabPath.EndsWith(".prefab")){// string[] dependPaths = AssetDatabase.GetDependencies(strPrefabPath);GameObject go = GameObject.Instantiate(GameObject.Find(strCurrSelectPrefabName)) as GameObject;PrefabUtility.ReplacePrefab(go, parentObject, ReplacePrefabOptions.ConnectToPrefab);GameObject.DestroyImmediate(activeGameObject);go.name = strCurrSelectPrefabName; AssetDatabase.Refresh();}Debug.Log("预制对象 " + strCurrSelectPrefabName + " 修改完成。");}else{Debug.Log("当前选中的GameObject命名不符合要求,格式:id+h。\tGameObject Name : " + activeGameObject.name);} }
最核心的几行代码:
1、实例化一个新的GameObject;
2、替换预制对象;
3、销毁老的GameObject;
4、刷新资源;
对于美术的同事来讲,最复杂、麻烦的莫过于重新关联属性,特别是骨骼动画。因为之前没有统一的规范,所以关联哪一段动画实际上是需要一层一层找的,我看着他们找都觉得累,怎么办呢?我想到一个办法,就是通过name查找新的组件,然后重新赋值关联。通过Name查找某个GameObject下的子节点(前提条件是该Name唯一)
public static GameObject FindChildGameObject(GameObject parent, string childName){if (parent.name == childName){return parent;}if (parent.transform.childCount < 1){return null;}GameObject obj = null;for (int i = 0; i < parent.transform.childCount; i++){GameObject go = parent.transform.GetChild(i).gameObject;obj = FindChildGameObject(go, childName);if (obj != null){break;}}return obj;}
上面基本上实现了,组件几个常用的方法:
1、添加组件(先复制后粘贴);
2、删除组件;
3、通过名字查找子组件;
4、更新预制对象;
Unity插件扩展中组件常用的几个方法相关推荐
- 作为SLAM中最常用的闭环检测方法,视觉词袋模型技术详解来了
摘自:https://mp.weixin.qq.com/s/OZnnuA31tEaVt0vnDOy5hQ 作为SLAM中最常用的闭环检测方法,视觉词袋模型技术详解来了 原创 小翼 飞思实验室 今天 基 ...
- PHP中一些常用证件的验证方法
内容转自:PHP中一些常用证件的验证方法 <?php/*** 来往港澳通行证:* 1.W,C+8位数字* 2.7位数字*/ function gapassport_verify($content ...
- [Unity][插件]游戏中显示FPS帧数
在Unity 的Asset Store 商店中搜索 FPS.这些插件用于显示 FPS帧数 FPS Counter,FPS Label,Fps Graph Analyzer
- Unity编辑器扩展——通用组件替换工具
在我们的项目过程中经常会遇到某个组件迭代的过程,那么在废弃旧组件,替换新组件的时候,就可以使用一个通用组件替换工具完成一键替换的功能. 设计图如下: 基类ReplaceComponentBase泛型类 ...
- android sdk插件开发教程,Android Studio Plugin 插件开发教程(二) —— 插件SDK中的常用对象介绍...
项目源码 系列教程 先树立一个概念,AS里项目的一切都可以视为对象,比如整个项目,项目里的每个文件,文件里的每个方法.每行语句等等都是一个对象.我们插件SDK的开发,主要工作就是针对这一个个的对象的分 ...
- js 中继承常用的几种方法
继承 继承: 就是指 一个对象 有权 去访问 另一个对象的成员属性 作用是实现代码的复用 继承的方式:只要能实现一个对象 有权访问另一个对象成员 的 方式 都可以成为是 实现继承的方式 3 .继承是对 ...
- 3D中的常用材质的调整方法
一.木纹材质调整方法 1. 木纹材质的肌理调整: A.使用过度色通道贴图后加入凹凸通道贴图,使木纹有凹凸感,肌理更明显凹凸通道强度通常为30% B.材质球的高光强度(specular level:)通 ...
- laravel中及其常用的一些函数方法(自己看)和技巧(不断添加中)
手册:https://laravelacademy.org/ 1.中间件的定义Middleware 2.路由的定义和写法 3.控制器Controller之Request 4.控制器Controller ...
- unittest Module中的常用6种断言方法
unittest Module中的断言方法 方法 作用 assertEqual(a,b) 核实 a ==b assertNotEqual(a,b) 核实 a !=b assertTrue(x) 核实x ...
最新文章
- 补充 宝玉 之《URL欺骗之以假乱真!》之 POST 方法提交数据 之 处理!
- 同时删除两张表的数据_把数据表中对应工作表的数据首先删除,然后导入数据...
- C#与C++的几个不同之处知识点
- 动态创建html元素的几种方法
- python的scrapy框架的安装_Python爬虫基础(四)--Scrapy框架的安装及介绍
- 网络作者的心声-23、网络作家大多赚'辛苦钱'
- jQuery中position()与offset()区别
- 艾默生变频器报警PHP,艾默生ct变频器报警ou 这个CT的变频器报警UU怎么解决?
- 12种主要的Dropout方法:如何应用于DNNs,CNNs,RNNs中的数学和可视化解释
- 九个数的全排列(避免重复出现)
- virtual 修饰符与继承对析构函数的影响(C++)
- libreoffice转换文件为pdf文件乱码问题解决办法
- 博客园复用别人的博客模板
- Jump Desktop for Mac(远程桌面控制工具)怎么链接windows电脑
- 常用Java编程软件有哪些
- 详解DNS域名解析全过程
- Windows7Windows10兼容红色警戒
- 如何在论文后面插参考文献
- AR涂涂乐⭐二、 给material赋予材质、移除material、调整扫描框透明度
- JavaScript数组常用方法总结及使用详解