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

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

请注意一定把这两个监听的脚本放在Editor文件夹下。

先是基类。

using System;
using System.Collections;
using System.Reflection;
using UnityEditor;
using UnityEngine;

[InitializeOnLoad]
public class EditorMonoBehaviour
{
    static EditorMonoBehaviour ()
    {
        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);
        var e = method.Invoke (null, new object[]{ typeof(EditorMonoBehaviour) }) as IEnumerable;
        foreach (Type editorMonoBehaviourClass in e) {
            method = editorMonoBehaviourClass.BaseType.GetMethod ("OnEditorMonoBehaviour", BindingFlags.NonPublic | BindingFlags.Instance);
            if (method != null) {
                method.Invoke (System.Activator.CreateInstance (editorMonoBehaviourClass), new object[0]);
            }
        }
    }

    private void OnEditorMonoBehaviour ()
    {

        EditorApplication.update += Update;
        EditorApplication.hierarchyWindowChanged += OnHierarchyWindowChanged;
        EditorApplication.hierarchyWindowItemOnGUI += HierarchyWindowItemOnGUI;
        EditorApplication.projectWindowChanged += OnProjectWindowChanged;
        EditorApplication.projectWindowItemOnGUI += ProjectWindowItemOnGUI;
        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);

        EditorApplication.searchChanged += OnSearchChanged;

        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
    }
}

接着是继承类,所有监听的事件在这里完成,两个类都不用实例化也不用NEW直接就可以监听。

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));
	}
}

思考:因为在这里我们只能得到它变化的事件,但是我们不知道哪个GameObject变化了。所以我觉得可以自己写一段代码来对比一下前后。 欢迎在下面给我留言,讨论与学习。谢谢。

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

时间: 2024-10-07 18:36:29

Unity3D研究之监听Hierachy、Project等视图结构变化的事件的相关文章

【转】Android开发20——单个监听器监听多个按钮点击事件

原文网址:http://woshixy.blog.51cto.com/5637578/1093936 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://woshixy.blog.51cto.com/5637578/1093936 一.单个按钮点击事件的监听 方法一 /** * 从网络上获取图片 * * @author 徐越 * */ public class MainActivity extends Activity { pri

Qt Gui中父控件监听子控件的IO事件

父对象重新定义自己继承自QObject的函数bool eventFilter(QObject* watched, QEvent* event). 子控件安装父对象的eventFilter: 例如, QTableView * itsView = new QTableView; itsView->viewport()->installEventFilter(this); Qt Gui中父控件监听子控件的IO事件

#你好Unity3D#Hierarchy视图监听gameObject点击事件

今天无意间又找到了个好方法 1 2 3 4 5 6 7 8 9 10 [InitializeOnLoadMethod] static void Start () { Selection.selectionChanged = delegate { Debug.Log(Selection.activeObject.name); }; } 前几天有朋友问过我怎么监听sceneview 和 hierarchy视图选择某个gameObject的事件,今天干好有时间我就研究研究. 下面的这两个代理事件大家都

Android研究之监听自身应用被卸载代码实现

1.通过jni实现函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 8

事件监听:诀别Android繁琐的事件注册机制——view.setOnXXXXListener 滚犊子

好久没写过随笔了......windows phone生态没起来,属于.net阵营的我最近工作不是太忙,闲暇之余就心血来潮开始研究安卓.先简单扯两句这几天学习下来对java事件监听机制的一点感触.客观地讲,java的事件监听机制相比.net好原始,暂不说委托.lamda.泛型等的繁琐,仅一个事件监听,就需要各种listener才能实现,比如安卓里到处都是view.setOnXXXXListener.被C#“语法糖”和宇宙第一IDE惯坏的我真心有点不习惯,于是就决定写个工具来封装这些烦人的list

监听JList列表项的单击事件

原文:http://blog.sina.com.cn/s/blog_5f1bfbd901015d5d.html 1 import java.awt.BorderLayout; 2 import java.awt.EventQueue; 3 import javax.swing.JFrame; 4 import javax.swing.JLabel; 5 import javax.swing.JList; 6 import javax.swing.JOptionPane; 7 import jav

监听Echarts 里的地图缩放事件

 // 获取百度地图实例,使用百度地图自带的控件     var bmap = myChart.getModel().getComponent('bmap').getBMap();     bmap.setMapStyle({style:'normal'});     bmap.addControl(new BMap.MapTypeControl());     bmap.addControl(new BMap.ScaleControl());      bmap.addControl(new 

Android 监听EditView中的文本改变事件

android中的编辑框EditText也比较常用,那比如在搜索框中,没输入一个字,下面的搜索列表就显示有包含输入关键字的选项,这个输入监听怎么实现的呢? 我们可以建一个例子,效果图如下: 我们可以监听光标处在哪个位置,选择了几个字符并处理,输入了几个字符 先新建布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.a

android监听虚拟键盘隐藏和显示事件

刚开始在onconfigurationChanged中监听,结果发现该方法在configuration变化即配置文件发生变化时才会被调用,如横竖屏切换,android重新载入配置文件时.而键盘隐藏不会触发该方法. 后来采用如下方法完美解决了键盘隐藏监听事件. //该Activity的最外层Layout finalView activityRootView = findViewById(R.id.activityRoot); //给该layout设置监听,监听其布局发生变化事件 activityR