最近为美术编写一个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插件扩展中组件常用的几个方法相关推荐

  1. 作为SLAM中最常用的闭环检测方法,视觉词袋模型技术详解来了

    摘自:https://mp.weixin.qq.com/s/OZnnuA31tEaVt0vnDOy5hQ 作为SLAM中最常用的闭环检测方法,视觉词袋模型技术详解来了 原创 小翼 飞思实验室 今天 基 ...

  2. PHP中一些常用证件的验证方法

    内容转自:PHP中一些常用证件的验证方法 <?php/*** 来往港澳通行证:* 1.W,C+8位数字* 2.7位数字*/ function gapassport_verify($content ...

  3. [Unity][插件]游戏中显示FPS帧数

    在Unity 的Asset Store 商店中搜索 FPS.这些插件用于显示 FPS帧数 FPS Counter,FPS Label,Fps Graph Analyzer

  4. Unity编辑器扩展——通用组件替换工具

    在我们的项目过程中经常会遇到某个组件迭代的过程,那么在废弃旧组件,替换新组件的时候,就可以使用一个通用组件替换工具完成一键替换的功能. 设计图如下: 基类ReplaceComponentBase泛型类 ...

  5. android sdk插件开发教程,Android Studio Plugin 插件开发教程(二) —— 插件SDK中的常用对象介绍...

    项目源码 系列教程 先树立一个概念,AS里项目的一切都可以视为对象,比如整个项目,项目里的每个文件,文件里的每个方法.每行语句等等都是一个对象.我们插件SDK的开发,主要工作就是针对这一个个的对象的分 ...

  6. js 中继承常用的几种方法

    继承 继承: 就是指 一个对象 有权 去访问 另一个对象的成员属性 作用是实现代码的复用 继承的方式:只要能实现一个对象 有权访问另一个对象成员 的 方式 都可以成为是 实现继承的方式 3 .继承是对 ...

  7. 3D中的常用材质的调整方法

    一.木纹材质调整方法 1. 木纹材质的肌理调整: A.使用过度色通道贴图后加入凹凸通道贴图,使木纹有凹凸感,肌理更明显凹凸通道强度通常为30% B.材质球的高光强度(specular level:)通 ...

  8. laravel中及其常用的一些函数方法(自己看)和技巧(不断添加中)

    手册:https://laravelacademy.org/ 1.中间件的定义Middleware 2.路由的定义和写法 3.控制器Controller之Request 4.控制器Controller ...

  9. unittest Module中的常用6种断言方法

    unittest Module中的断言方法 方法 作用 assertEqual(a,b) 核实 a ==b assertNotEqual(a,b) 核实 a !=b assertTrue(x) 核实x ...

最新文章

  1. 补充 宝玉 之《URL欺骗之以假乱真!》之 POST 方法提交数据 之 处理!
  2. 同时删除两张表的数据_把数据表中对应工作表的数据首先删除,然后导入数据...
  3. C#与C++的几个不同之处知识点
  4. 动态创建html元素的几种方法
  5. python的scrapy框架的安装_Python爬虫基础(四)--Scrapy框架的安装及介绍
  6. 网络作者的心声-23、网络作家大多赚'辛苦钱'
  7. jQuery中position()与offset()区别
  8. 艾默生变频器报警PHP,艾默生ct变频器报警ou 这个CT的变频器报警UU怎么解决?
  9. 12种主要的Dropout方法:如何应用于DNNs,CNNs,RNNs中的数学和可视化解释
  10. 九个数的全排列(避免重复出现)
  11. virtual 修饰符与继承对析构函数的影响(C++)
  12. libreoffice转换文件为pdf文件乱码问题解决办法
  13. 博客园复用别人的博客模板
  14. Jump Desktop for Mac(远程桌面控制工具)怎么链接windows电脑
  15. 常用Java编程软件有哪些
  16. 详解DNS域名解析全过程
  17. Windows7Windows10兼容红色警戒
  18. 如何在论文后面插参考文献
  19. AR涂涂乐⭐二、 给material赋予材质、移除material、调整扫描框透明度
  20. JavaScript数组常用方法总结及使用详解

热门文章

  1. 使用frp进行内网穿透的实例
  2. docker将容器设置与宿主机为同一局域网
  3. python调用sklearn中朴素贝叶斯踩坑
  4. MYSQL的replace into
  5. Spring MVC —— 前后台传递JSON
  6. Linux内核访问外设I/O--动态映射(ioremap)和静态映射(map_desc) (转载)
  7. OC基础1:一些基本概念
  8. C#/SQL 上周本周
  9. 让TortoiseGit记住帐号密码方法
  10. leetcode 100.Same Tree