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编辑器提供的各种功能的更多相关文章

  1. 调用discuz编辑器再也不是问题了

    前面讲了如何开发一个discuz的特殊主题插件,详情可在此查看discuz特殊主题插件开发步骤和犯的愚蠢错误.上一篇文章讲解的是一些简单的开发步骤,不涉及到具体的编码.网页编辑器之类的都是系统默认带过 ...

  2. 转载unity编辑器xml数据库插件

    unity编辑器xml数据库插件 注:9月9日更新,其中MyXML.cs中有一句代码写错,查找功能失误,文中已经修改! 注:9月1日更新说明:xml存储结构,因为在用xml之前不知道正规的xml数据结 ...

  3. 【Unity编辑器】UnityEditor多重弹出窗体与编辑器窗口层级管理

    一.简介 最近马三为公司开发了一款触发器编辑器,对于这个编辑器策划所要求的质量很高,是模仿暴雪的那个触发器编辑器来做的,而且之后这款编辑器要作为公司内部的一个通用工具链使用.其实,在这款触发器编辑器之 ...

  4. Unity编辑器扩展chapter1

    Unity编辑器扩展chapter1 unity通过提供EditorScript API 的方式为我们提供了方便强大的编辑器扩展途径.学好这一部分可以使我们学会编写一些工具来提高效率,甚至可以自制一些 ...

  5. unity 编辑器扩展简单入门

    unity 编辑器扩展简单入门 通过使用编辑器扩展,我们可以对一些机械的操作实现自动化,而不用使用额外的环境,将工具与开发环境融为一体:并且,编辑器扩展也提供GUI库,来实现可视化操作:编辑器扩展甚至 ...

  6. 从vs2010的UnitTestFramework类库提取私有方法反射调用的方法

    背景 年龄大点的程序员都知道在vs2010中创建单元测试非常的简单,鼠标定位在方法名字,右键创建单元测试,就会创建一个测试方法,即使是在私有方法上也可以创建测试方法. VS2010以后就没这么简单了, ...

  7. python 反射调用

    因为目前在写一个python的项目,用到了Python的反射机制,所以做一下笔记,把写项目过程中的感悟记下来. 先简单介绍下Demo用到的函数: sys.path 是python的模块的路径集,是一个 ...

  8. 反射-优化及程序集等(用委托的方式调用需要反射调用的方法(或者属性、字段),而不去使用Invoke方法)

    反射-优化及程序集等(用委托的方式调用需要反射调用的方法(或者属性.字段),而不去使用Invoke方法)   创建Delegate (1).Delegate.CreateDelegate(Type, ...

  9. Java 反射 调用私有域和方法(setAccessible)

    Java 反射 调用私有域和方法(setAccessible) @author ixenos AccessibleObject类 Method.Field和Constructor类共同继承了Acces ...

随机推荐

  1. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

  2. 轻松理解Redux原理及工作流程

    轻松理解Redux原理及工作流程 Redux由Dan Abramov在2015年创建的科技术语.是受2014年Facebook的Flux架构以及函数式编程语言Elm启发.很快,Redux因其简单易学体 ...

  3. 网络 [HNOI2016]

    Description 一个简单的网络系统可以被描述成一棵无根树.每个节点为一个服务器.连接服务器与服务器的数据线则看做一条树边.两个服务器进行数据的交互时,数据会经过连接这两个服务器的路径上的所有服 ...

  4. 逻辑回归与神经网络还有Softmax regression的关系与区别

    本文讨论的关键词:Logistic Regression(逻辑回归).Neural Networks(神经网络) 之前在学习LR和NN的时候,一直对它们独立学习思考,就简单当做是机器学习中的两个不同的 ...

  5. 安装 VS2017 的正确姿势

    自从装了长城带宽,我的肠子就变成青色的了. 国内的网络环境,真的是有很大的不同,有的人装 VS 的时候,号称满速,有的人(其实就是我)要等它下载很久,还告诉我有个组件没有安装成功.很久很久以前,VS ...

  6. Vue(八)发送跨域请求

    使用vue-resource发送跨域请求 axios不支持跨域 1 安装vue-resource并引入 cnpm install vue-resource -S 2 基本用法 使用this.$http ...

  7. js中字符串的方法

    js String对象中常用方法小结,需要的朋友可以参考下: 1.charCodeAt方法返回一个整数,代表指定位置字符的Unicode编码. strObj.charCodeAt(index) 说明: ...

  8. Miller Rabin素数检测

    #include<iostream> #include<cstdio> #include<queue> #include<cstring> #inclu ...

  9. Mac安装Linux的KVM管理工具virt-manager

    安装: brew tap jeffreywildman/homebrew-virt-manager brew install virt-manager virt-viewer 中途会碰到很多问题,可以 ...

  10. mormot支持TCP/IP

    mormot支持TCP/IP http.sys本来就构建于TCP/IP之上,因此HTTP.SYS是支持TCP/IP连接的. 笔者为此特意写了一个测试DEMO.TCP/IP连接成功. 如果客户端过一段时 ...