博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通过反射调用Unity编辑器提供的各种功能
阅读量:6312 次
发布时间:2019-06-22

本文共 2577 字,大约阅读时间需要 8 分钟。

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(300, 300);        window.Show();    }    private void OnGUI()    {        if (GUILayout.Button("Project.DuplicateSelectedAssets", GUILayout.Height(50)))        {            ProjectDuplicate();        }        if (GUILayout.Button("Hierarchy.DuplicateSelectedAssets", GUILayout.Height(50)))        {            HierarchyDuplicate();        }        if (GUILayout.Button("GameView.SizeSelection", GUILayout.Height(50)))        {            SetGameView(1);        }    }    // 拷贝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 });    }}

   总之,编辑器功能强大,皆能为我所用,方法就是反射,以上!

转载地址:http://kohxa.baihongyu.com/

你可能感兴趣的文章
linux下vsftp 虚拟用户的建立
查看>>
awstats tomcat linux
查看>>
《统一沟通-微软-实战》-6-部署-1-前端服务器-1-准备 Active Directory 域服务
查看>>
QQ帮助他人03-Skype for business 用户无法登录
查看>>
nagios 安装时一些问题及解决方法
查看>>
导入 导出 jeesite框架封装
查看>>
关于ASP.NET MVC4 Web API简单总结
查看>>
MSSVR邮件存储模块历史打包权重调整脚本
查看>>
Java程序员从笨鸟到菜鸟之(十六)CSS基础积累总结(上)
查看>>
"codeguy/upload": "^1.3" php上传组件
查看>>
我的友情链接
查看>>
sshd系统自带启动脚本详解
查看>>
yum升级php到5.2
查看>>
我的友情链接
查看>>
JAVA学习日志(7-4-接口)
查看>>
我的友情链接
查看>>
ansible-playbook 剧本
查看>>
明天入职!
查看>>
MongoDB操作
查看>>
linux文件查找之find的用法
查看>>