监听Hierachy、Project等视图结构变化的事件

            之前上网看了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));
}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246380.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux交叉编译tile环境搭建,g ++ - 在Ubuntu中在32位上交叉编译64位程序时,缺少包含“bits / c ++ config.h”...

在我的64位系统上,我注意到存在以下目录:/usr/include/c/4.4/x86_64-linux-gnu/32/bits那么我的32位系统已经设置为64位交叉编译就应该有一个相应的目录,如:/usr/include/c/4.4/i686-linux-gnu/64/bits我仔细检查了这个目录不存在…

Unity3D研究院之获取摄像机的视口区域

在网上看了momo的文章,在这把代码加入些注释,也便于自己理解记忆。原理很简单,就是根据摄像机的参数计算距离摄像机某一距离的摄像机窗口四个position。 using UnityEngine; using System.Collections;public class CameraView : MonoBehavio…

linux 的文件软链接隐藏,Linux inode及硬链接软链接详解

Linux inode及硬链接软链接详解York • 2020 年 09 月 28 日Loading...操作系统的文件数据除了实际内容之外,通常含有非常多的属性,例如 Linux操作系统的文件权限与文件属性。文件系统通常会将这两部分内容分别存放在 inode和 block中。---# inode 和 bl…

Unity中date相关问题

今天遇到了从服务器获取unix时间戳,将其转换为时间并显示的需求。Unity中可以使用C#中有关的date函数来处理这个问题。 首先UNIX时间戳的定义如下: Unix时间戳(英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp) 是…

linux集群管理权限,Linux下ACL权限管理

1.开启ACL功能(1)永久开启①#tune2fs -o acl /dev/sdb2②#cd /etc/fstab#vim fstab写入:/dev/sdb2 /mnt/sdb ext3 defaults,acl 0 0(2)临时开启已挂起的分区:#mount -o remount acl /dev/sdb2未挂载的分区#mount -o /dev/sdb2 /mnt/sdb2.查看是否开启ACL#tune2fs -l…

查找unity工程代码中中文字符

游戏本地化的时候可能需要搜索工程代码中的中文字符。 这个可以通过加载文件一行一行读取后,通过正则来查询。 下面的代码LoadFile函数通过流加载文件,FindFile通过递归病使用DirectoryInfo类和FileInfo类读取子目录和文件,并通过正则匹配出…

linux so_nosigpipe,TCP_NODELAY/SO_LINGER/SO_NOSIGPIPE/MSG_NOSIGNAL设置

下面是TCP_NODELAY/SO_LINGER/SO_NOSIGPIPE/MSG_NOSIGNAL的设置方法:其中由于平台的不同,区分SO_NOSIGPIPE和MSG_NOSIGNAL有所分区:int optval 1;// turn off SIGPIPE signal#ifdef __linux__setsockopt(m_Sockfd, SOL_SOCKET, MSG_NOSIGNAL…

Unity将来时:IL2CPP是什么?

Unity3D 想必大家都不陌生,独立游戏制作者们很多人都在用它,甚至一些大公司也用在很商业的游戏制作上。Unity3D最大的一个特点是一次制作,多平台部署,而 这一核心功能是靠Mono实现的。可以说Mono是Unity3D核心的核心,是…

计算信源熵和香农编码C语言,信息论与编码课程设计报告-统计信源熵与香农编码.pdf...

信息论与编码课程设计报告设计题目: 统计信源熵与香农编码专业班级 电 信 12-06学 号学生姓名指导教师教师评分2015 年 3 月 30 日目 录- 0 -一、设计任务与要求1.统计信源熵要求:统计任意文本文件中各字符(不区分大小写)数量,计算字符概率&a…

手游频繁崩溃”闪退”? 从程序上找原因

手游频繁崩溃”闪退”? 从程序上找原因 作为玩家,当游戏crash的时候是什么心情,如果这个游戏玩起来还不错的话,那我可能还会打开第二次,如果这个游戏一般的话我可能直接怒删了。当多次出现闪退crash的时候,…

汇编语言属于C语言吧,汇编语言和c语言的区别是什么

区别:汇编语言的效率高,对硬件的可操控性更强,体积小,不易维护,可移植性很差;c语言的效率比较低,硬件可操控性比较差,目标代码体积大,容易维护,可移植性很好。…

c语言某一行不被优化,C语言优化小技巧

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼在编写C语言程序后,经常需要对源码进行优化,以提高程序的运行效率,下面简述几个常用的优化技巧以供大家参考:1.C于代码在程序中的优化现在的C编译器会自动对代码进行优化,…

一款已上市MMO手游地图同步方案总结

1. 客户端地图格子的相关知识在2.5D的MMO游戏里,角色是通过3D的方式渲染,2D的地图是通过2D的方式显示,所以在客户端一般会有三个坐标系: a) 3D坐标系:所有需要3D渲染的角色和光效,都以3D坐标系中定位。 b) …

策略模式与简单工厂模式区别(转)

最近一直在抽时间研究设计模式,之前对设计模式也有一定的了解,但是都没有平心静气的去研究过,只是了解了一些皮毛,最近打算再深入研究一下,重新打开了设计模式的数据,对之前的疑问一个个的刨根问底&#xf…

c语言中枚举类型的长度,C中的枚举类型数据的大小是多少?

这是一个C面试测试问题不是家庭作业。#include using namespace std;enum months_t { january, february, march, april, may, june, july, august, september,october, november, december} y2k;int main (){cout << "sizeof months_t is " << sizeof(m…

求平方根sqrt()函数的底层算法效率问题

我们平时经常会有一些数据运算的操作&#xff0c;需要调用sqrt&#xff0c;exp&#xff0c;abs等函数&#xff0c;那么时候你有没有想过&#xff1a;这个些函数系统是如何实现的&#xff1f;就拿最常用的sqrt函数来说吧&#xff0c;系统怎么来实现这个经常调用的函数呢&#xf…

android espresso跨程序,Android Espresso:依次运行多个测试

我正在尝试使用Espresso forAndroid进行一系列测试.运行之间似乎没有关闭活动.一次测试后,无论应用程序状态如何,左侧为下一次测试.如何用Espresso来实现&#xff1f;错误报告中提供的修复程序的问题是,这将仅在整个套件的完成时执行.如果你想在每次测试后都有一个干净的活动堆…

C#中字符串的内存分配与驻留池

刚开始学习C#的时候&#xff0c;就听说CLR对于String类有一种特别的内存管理机制&#xff1a;有时候&#xff0c;明明声明了两个String类的对象&#xff0c;但是他们偏偏却指向同一个实例。如下&#xff1a; String s1 “Hello”; String s2 “Hello”; //s2和s1的实际值都…

signature=f2388c4f1bce538cc797410d9560f03b,KSHV strategies for host dsDNA sensing machinery

摘要&#xff1a;The innate immune system utilizes pattern recognition receptors cyclic GMP-AMP synthase(cGAS)to sense cytosolic double-stranded(ds) DNA and initiate type 1 interferon signaling and autophagy pathway, which collaborate to limit pathogen infe…

Unity 内存管理

一&#xff1a;资源类型 GameObject, Transform, Mesh, Texture, Material, Shader, noxss和各种其他Assets。 二&#xff1a;AssetBundle文件内存镜像 来自文件就用CreateFromFile(注意这种方法只能用于standalone程序&#xff09;这是最快的加载方法。也可以来自Memory,用…