通过反射调用Unity编辑器提供的各种功能
Unity编辑器功能丰富易上手,其实编辑器提供的大多数菜单操作,在代码里面都是能够找到对应接口的,但是这些接口都没有对我们开放,怎么办?
很简单,直接使用反射调用即可。
首先使用Reflector或ILSpy将UnityEditor和UnityEngine进行反编译(有源码的可以直接查看源码更好),然后在里面找你需要的功能即可,unity的底层代码命名是非常规范的,多数功能都能直观的找到:
下图中是Hierarchy视图中一些操作函数,怎么样,是不是很直观:

怎么调用这些函数呢,下面展示了static function和member function的调用方式,参考着用即可:
using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic; public class DIYEditor : EditorWindow
{
private static EditorWindow window; [MenuItem("DIY/SelfEditor")]
public static void Execute()
{
if (window == null)
window = (DIYEditor)GetWindow(typeof(DIYEditor));
window.minSize = new Vector2(, );
window.Show();
} private void OnGUI()
{
if (GUILayout.Button("Project.DuplicateSelectedAssets", GUILayout.Height()))
{
ProjectDuplicate();
} if (GUILayout.Button("Hierarchy.DuplicateSelectedAssets", GUILayout.Height()))
{
HierarchyDuplicate();
} if (GUILayout.Button("GameView.SizeSelection", GUILayout.Height()))
{
SetGameView();
}
} // 拷贝Project视图中的某个Prefab
private void ProjectDuplicate()
{
var type = typeof(Editor).Assembly.GetType("UnityEditor.ProjectWindowUtil"); var duplicate = type.GetMethod("DuplicateSelectedAssets",
System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static); duplicate.Invoke(null, null);
} // 拷贝Hierarchy视图中的某个Prefab,优点:(1)速度快(2)保持引用关系。在代码中Instantiate会丢失引用,并且速度很慢
private void HierarchyDuplicate()
{
var type = typeof(Editor).Assembly.GetType("UnityEditor.SceneHierarchyWindow");
var window = EditorWindow.GetWindow(type);
var duplicateSelectedFunc = type.GetMethod("DuplicateGO",
System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic); duplicateSelectedFunc.Invoke(window, null);
} // 手动设置Game视图的分辨率,可以用来在编辑态下动态改变runtime分辨率
public static void SetGameView(int index)
{
var type = typeof(Editor).Assembly.GetType("UnityEditor.GameView");
var window = EditorWindow.GetWindow(type);
var SizeSelectionCallback = type.GetMethod("SizeSelectionCallback",
System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic);
SizeSelectionCallback.Invoke(window, new object[] { index, null });
}
}
总之,编辑器功能强大,皆能为我所用,方法就是反射,以上!
通过反射调用Unity编辑器提供的各种功能的更多相关文章
- 调用discuz编辑器再也不是问题了
前面讲了如何开发一个discuz的特殊主题插件,详情可在此查看discuz特殊主题插件开发步骤和犯的愚蠢错误.上一篇文章讲解的是一些简单的开发步骤,不涉及到具体的编码.网页编辑器之类的都是系统默认带过 ...
- 转载unity编辑器xml数据库插件
unity编辑器xml数据库插件 注:9月9日更新,其中MyXML.cs中有一句代码写错,查找功能失误,文中已经修改! 注:9月1日更新说明:xml存储结构,因为在用xml之前不知道正规的xml数据结 ...
- 【Unity编辑器】UnityEditor多重弹出窗体与编辑器窗口层级管理
一.简介 最近马三为公司开发了一款触发器编辑器,对于这个编辑器策划所要求的质量很高,是模仿暴雪的那个触发器编辑器来做的,而且之后这款编辑器要作为公司内部的一个通用工具链使用.其实,在这款触发器编辑器之 ...
- Unity编辑器扩展chapter1
Unity编辑器扩展chapter1 unity通过提供EditorScript API 的方式为我们提供了方便强大的编辑器扩展途径.学好这一部分可以使我们学会编写一些工具来提高效率,甚至可以自制一些 ...
- unity 编辑器扩展简单入门
unity 编辑器扩展简单入门 通过使用编辑器扩展,我们可以对一些机械的操作实现自动化,而不用使用额外的环境,将工具与开发环境融为一体:并且,编辑器扩展也提供GUI库,来实现可视化操作:编辑器扩展甚至 ...
- 从vs2010的UnitTestFramework类库提取私有方法反射调用的方法
背景 年龄大点的程序员都知道在vs2010中创建单元测试非常的简单,鼠标定位在方法名字,右键创建单元测试,就会创建一个测试方法,即使是在私有方法上也可以创建测试方法. VS2010以后就没这么简单了, ...
- python 反射调用
因为目前在写一个python的项目,用到了Python的反射机制,所以做一下笔记,把写项目过程中的感悟记下来. 先简单介绍下Demo用到的函数: sys.path 是python的模块的路径集,是一个 ...
- 反射-优化及程序集等(用委托的方式调用需要反射调用的方法(或者属性、字段),而不去使用Invoke方法)
反射-优化及程序集等(用委托的方式调用需要反射调用的方法(或者属性.字段),而不去使用Invoke方法) 创建Delegate (1).Delegate.CreateDelegate(Type, ...
- Java 反射 调用私有域和方法(setAccessible)
Java 反射 调用私有域和方法(setAccessible) @author ixenos AccessibleObject类 Method.Field和Constructor类共同继承了Acces ...
随机推荐
- Java笔记(四)常用基础类
常用基础类 一)String String内部用一个字符数组表示字符串: private final char value[]; 注意:Java9对此做了优化,采用byte[],如果字符都是ASCII ...
- 杭店 ACM 1864 最大报销额 01背包
![勾选C++才能过 题意: 先规定可以报销一定额度的发票,物品类型有A,B,C,三种.要求每张发票总额不得超过1000元,单项物品不得超过600.求报销的最大额 分析: 先找到合格的发票,然后再挑选 ...
- Linux vi/vim命令高效助记图
图片来源网上,如有侵权,请告知,我会删除掉,谢谢~ 常用编辑按键: 1 vi +[num] file 打开文件,并将光标置于第n行首 2 vi + file 打开文件,并将光标置于最后一行首 3 vi ...
- CallContext,ThreadStatic,AsyncLocal<T>,ThreadLocal<T>,学习笔记
1.CallContext 在当前调用上下文的线程数据槽里存储对象 2.ThreadStatic 是一个特性 3.AsyncLocal<T> 是一个类型,该字段应当为static,保证单例 ...
- UE4入门(二)建立和打开项目
1.双击电脑桌面上的Unreal Engine 2.见下图 建立c++或者蓝图项目: 蓝图是什么? 蓝图种类: 接口:
- js将文字转化为语音并播放
js将页面中的某些文字信息转化为语音并自动播放 <!DOCTYPE html><html lang="en"><head> <meta c ...
- NodeJS 连接接MySQL
NodeJS 连接接MySQL MySQL是常用数据库,作为后端模块,nodejs可以提供了mysql接口 安装 $ npm install mysql 测试代码 var mysql = requir ...
- Mac使用Xcode配置openGL
Mac使用Xcode配置openGL 博主这学期有图形学课要用到OpenGL,于是首先就开始配置开发环境了.应该说网上Windows上配置OpenGL教程比较多,Mac版的比较少.博主特来分享配置过程 ...
- 记录下pytorch代码从0.3版本迁移到0.4版本要做的一些更改。
1. UserWarning: Implicit dimension choice for log_softmax has been deprecated. Change the call to in ...
- securecrt通过ssh连接板子: 密钥交换失败,没有兼容的加密程序
在用securecrt连接板子时遇到如下问题: 需要修改板子上的/etc/ssh/ssh_config和/etc/ssh/sshd_config. 修改/etc/ssh/ssh_config,取消下面 ...