之前上网看了MOMO关于监听Hierachy、Project等视图结构变化的事件,原代码是一个日本人写的,MOMO也没有讲原理。这里我通过自己的理解加了些注释,可能有不正确的地方,希望大神指点。

其中用到了[InitializeOnLoad],可以监听Unity的启动事件,在启动Unity的时候运行编辑器脚本。需要静态的构造函数! 这是下面的代码中EditorMonoBehaviour构造函数为什么是static的原因。

using System;
using System.Collections;
using System.Reflection;
using UnityEditor;
using UnityEngine;
[InitializeOnLoad]
public class EditorMonoBehaviour
{
static EditorMonoBehaviour ()
{
//获取UnityEditor.EditorAssemblies中的SubclassesOf方法
var type = Types.GetType ("UnityEditor.EditorAssemblies", "UnityEditor.dll");
var method = type.GetMethod ("SubclassesOf", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[]{ typeof(Type) }, null);
//调用SubclassesOf方法获得所有继承于EditorMonoBehaviour的类
var e = method.Invoke (null, new object[]{ typeof(EditorMonoBehaviour) }) as IEnumerable;
foreach (Type editorMonoBehaviourClass in e) {
//获取editorMonoBehaviourClass即继承于EditorMonoBehaviour的类中的OnEditorMonoBehaviour方法
method = editorMonoBehaviourClass.BaseType.GetMethod ("OnEditorMonoBehaviour", BindingFlags.NonPublic | BindingFlags.Instance);
//创建实例并调用editorMonoBehaviourClass中的OnEditorMonoBehaviour方法
if (method != null) {
method.Invoke (System.Activator.CreateInstance (editorMonoBehaviourClass), new object[0]);
}
}
}
private void OnEditorMonoBehaviour ()
{
EditorApplication.update += Update;
//Each time an object is (or a group of objects are) created, renamed, parented, unparented or destroyed this callback is raised.
EditorApplication.hierarchyWindowChanged += OnHierarchyWindowChanged;
//Delegate for OnGUI events for every visible list item in the HierarchyWindow.
EditorApplication.hierarchyWindowItemOnGUI += HierarchyWindowItemOnGUI;
//Callback raised whenever the state of the Project window changes.
EditorApplication.projectWindowChanged += OnProjectWindowChanged;
//Delegate for OnGUI events for every visible list item in the ProjectWindow.
EditorApplication.projectWindowItemOnGUI += ProjectWindowItemOnGUI;
//Delegate for changed keyboard modifier keys
EditorApplication.modifierKeysChanged += OnModifierKeysChanged;
// globalEventHandler
EditorApplication.CallbackFunction function = () => OnGlobalEventHandler (Event.current);
FieldInfo info = typeof(EditorApplication).GetField ("globalEventHandler", BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic);
EditorApplication.CallbackFunction functions = (EditorApplication.CallbackFunction)info.GetValue (null);
functions += function;
info.SetValue (null, (object)functions);
//Callback raised whenever the contents of a window's search box are changed.
EditorApplication.searchChanged += OnSearchChanged;
//Delegate for play mode state changes.
EditorApplication.playmodeStateChanged += () => {
if (EditorApplication.isPaused) {
OnPlaymodeStateChanged (PlayModeState.Paused);
}
if (EditorApplication.isPlaying) {
OnPlaymodeStateChanged (PlayModeState.Playing);
}
if (EditorApplication.isPlayingOrWillChangePlaymode) {
OnPlaymodeStateChanged (PlayModeState.PlayingOrWillChangePlaymode);
}
};
}
public virtual void Update ()
{
}
public virtual void OnHierarchyWindowChanged ()
{
}
public virtual void HierarchyWindowItemOnGUI (int instanceID, Rect selectionRect)
{
}
public virtual void OnProjectWindowChanged ()
{
}
public virtual void ProjectWindowItemOnGUI (string guid, Rect selectionRect)
{
}
public virtual void OnModifierKeysChanged ()
{
}
public virtual void OnGlobalEventHandler (Event e)
{
}
public virtual void OnSearchChanged ()
{
}
public virtual void OnPlaymodeStateChanged (PlayModeState playModeState)
{
}
public enum PlayModeState
{
Playing,
Paused,
Stop,
PlayingOrWillChangePlaymode
}
}

子类:就不加注释了,理解起来很简单

using UnityEditor;
using UnityEngine;
public class NewBehaviourScript : EditorMonoBehaviour
{
public override void Update ()
{
//Debug.Log ("每一帧回调一次");
}
public override void OnPlaymodeStateChanged (PlayModeState playModeState)
{
Debug.Log ("游戏运行模式发生改变, 点击 运行游戏 或者暂停游戏或者 帧运行游戏 按钮时触发: " + playModeState);
}
public override void OnGlobalEventHandler (Event e)
{
Debug.Log ("全局事件回调: " + e);
}
public override void HierarchyWindowItemOnGUI (int instanceID, Rect selectionRect)
{
Debug.Log (string.Format ("{0} : {1} - {2}", EditorUtility.InstanceIDToObject (instanceID), instanceID, selectionRect));
}
public override void OnHierarchyWindowChanged ()
{
Debug.Log ("层次视图发生变化");
}
public override void OnModifierKeysChanged ()
{
Debug.Log ("当触发键盘事件");
}
public override void OnProjectWindowChanged ()
{
Debug.Log ("当资源视图发生变化");
}
public override void ProjectWindowItemOnGUI (string guid, Rect selectionRect)
{
//根据GUID得到资源的准确路径
//  Debug.Log (string.Format ("{0} : {1} - {2}", AssetDatabase.GUIDToAssetPath (guid), guid, selectionRect));
}
}

监听Hierachy、Project等视图结构变化的事件相关推荐

  1. Unity3D之监听Hierachy、Project等视图结构变化的事件

    以前就有人问我怎么监听Hierarchy视图中创建或删除变化的事件,当时因为有别的事情就没研究这块.刚好最近有这一类的需求我就学习学习.网上发现了一个日本人写的文档,实现的原理很有意思,内容不错我就翻 ...

  2. redis 能不能监听特定的key失效_php监听redis key失效触发回调事件

    订单超时.活动过期解决方案:php监听redis key失效触发回调事件 Redis 的 2.8.0 版本之后可用,键空间消息(Redis Keyspace Notifications),配合 2.0 ...

  3. android列表项点击事件,Android 开发 tips(2):监听 Listview 列表项点击事件

    Android 开发 tips(2):监听 Listview 列表项点击事件 (这篇和上篇本来是应该一起写的,但是太过冗长,附链接:[SimpleAdapter 在 Listview 中的应用] ht ...

  4. php 监听redis,php监听redis key失效触发回调事件_后端开发

    php中使用fsockopen实现异步请求(代码示例)_后端开发 php执行一段程序,有可能几毫秒就执行完毕,也有可能耗时较长.例如,用户下单这个事件,如果调用了些第三方服务进行发邮件.短信.推送等通 ...

  5. 事件监听机制(一)Java事件监听

    事件监听机制(一)Java事件监听 事件监听实现流程 事件对象: 继承自java.util.EventObject对象,由开发者自行定义实现. 事件源: 就是触发事件的源头,不同的事件源会触发不同的事 ...

  6. php 监听redis,php监听redis key失效触发回调事件

    订单超时.活动过期解决方案:php监听redis key失效触发回调事件 Redis 的 2.8.0 版本之后可用,键空间消息(Redis Keyspace Notifications),配合 2.0 ...

  7. html 页面自动滚动,js监听html页面的上下滚动事件方法

    最近在一个项目中,在写前端页面的时候,想像以前做Android时在页面时刻监听上下滚动的事件,查找资料发现由鼠标或类似用户动作触发的事件有以下图示: 不多说了,直接上代码了,经过测试可以使用: Dom ...

  8. BOS项目02_02_zTree-通过ajax的获取菜单数据、监听树形菜单的点击事件、读取json文件、Ajax获取数据

    系列文章目录 文章目录 系列文章目录 前言 一.发送ajax网络请求获取菜单数据 二.监听树形菜单的点击事件 总结 前言 一.发送ajax网络请求获取菜单数据 我们现在的数是写死的,那么实际项目中我们 ...

  9. js监听页面最大化,最小化事件

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

最新文章

  1. Mysql客户端中文乱码问题解决
  2. python自动测试p-关于《Python自动化测试实战》
  3. MPI学习存在的一些问题
  4. ubuntu安装matlab2009,Ubuntu中安装Matlab2010a
  5. 前后端分离如何解决跨域的问题?
  6. ffmpeg 解码音频(aac、mp3)输出pcm文件
  7. 计算机科学实验班高考线,北京工业大学计算机科学与技术(实验班)专业2015年在北京理科高考录取最低分数线...
  8. 这五件事发生的时候,就是 ICO 泡沫破裂的那一天
  9. python 字符串数组转换为浮点数,如何在numpy中将字符串数组转换为浮点数数组?...
  10. CSS 图片去色处理
  11. PDF区域文本提取工具
  12. Xcode打包ipa的步骤
  13. 最新如何将b站视频下载到电脑上不用插件
  14. 经济机器是怎样运行的(文字版)-瑞.达利欧
  15. Windows Phone 8107更新方法
  16. Matlab论文插图绘制模板第33期—等高线填充图(contourf)
  17. 世界你好python_Python中的彩蛋(哈哈哈)
  18. 麦克米伦高阶词典 7500词汇表 红星
  19. 一键还原奥运版_1.2亿人看新浪奥运图文直播 移动时代大赛报道如何决胜?
  20. springboot生成接口文档

热门文章

  1. fastjson jar包_经过性能对比,我发现温少的FastJson真牛。
  2. codeforces 1038a(找最长的前k个字母出现相同次数的字符串)水题
  3. 【计算机组成原理】定点除法运算
  4. java实现顺序栈_Java实现顺序栈原理解析
  5. mysql版本 hibernate_Mysql 不同版本 说明
  6. Java学习笔记_字符串/静态static
  7. plsql如何显示表结构图_工地新人如何看懂图纸
  8. IncompatibleClassChangFound interface org.apache.hadoop.mapreduce.JobContext, but class was expected
  9. zookeeper集群部署(分布式)
  10. linux 生成和使用动态链接库和静态链接库的Makefile编写