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

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

先是基类。

  1. using System;
  2. using System.Collections;
  3. using System.Reflection;
  4. using UnityEditor;
  5. using UnityEngine;
  6. [InitializeOnLoad]
  7. public class EditorMonoBehaviour
  8. {
  9. static EditorMonoBehaviour ()
  10. {
  11. var type = Types.GetType ("UnityEditor.EditorAssemblies", "UnityEditor.dll");
  12. var method = type.GetMethod ("SubclassesOf", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[]{ typeof(Type) }, null);
  13. var e = method.Invoke (null, new object[]{ typeof(EditorMonoBehaviour) }) as IEnumerable;
  14. foreach (Type editorMonoBehaviourClass in e) {
  15. method = editorMonoBehaviourClass.BaseType.GetMethod ("OnEditorMonoBehaviour", BindingFlags.NonPublic | BindingFlags.Instance);
  16. if (method != null) {
  17. method.Invoke (System.Activator.CreateInstance (editorMonoBehaviourClass), new object[0]);
  18. }
  19. }
  20. }
  21. private void OnEditorMonoBehaviour ()
  22. {
  23. EditorApplication.update += Update;
  24. EditorApplication.hierarchyWindowChanged += OnHierarchyWindowChanged;
  25. EditorApplication.hierarchyWindowItemOnGUI += HierarchyWindowItemOnGUI;
  26. EditorApplication.projectWindowChanged += OnProjectWindowChanged;
  27. EditorApplication.projectWindowItemOnGUI += ProjectWindowItemOnGUI;
  28. EditorApplication.modifierKeysChanged += OnModifierKeysChanged;
  29. // globalEventHandler
  30. EditorApplication.CallbackFunction function = () => OnGlobalEventHandler (Event.current);
  31. FieldInfo info = typeof(EditorApplication).GetField ("globalEventHandler", BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic);
  32. EditorApplication.CallbackFunction functions = (EditorApplication.CallbackFunction)info.GetValue (null);
  33. functions += function;
  34. info.SetValue (null, (object)functions);
  35. EditorApplication.searchChanged += OnSearchChanged;
  36. EditorApplication.playmodeStateChanged += () => {
  37. if (EditorApplication.isPaused) {
  38. OnPlaymodeStateChanged (PlayModeState.Paused);
  39. }
  40. if (EditorApplication.isPlaying) {
  41. OnPlaymodeStateChanged (PlayModeState.Playing);
  42. }
  43. if (EditorApplication.isPlayingOrWillChangePlaymode) {
  44. OnPlaymodeStateChanged (PlayModeState.PlayingOrWillChangePlaymode);
  45. }
  46. };
  47. }
  48. public virtual void Update ()
  49. {
  50. }
  51. public virtual void OnHierarchyWindowChanged ()
  52. {
  53. }
  54. public virtual void HierarchyWindowItemOnGUI (int instanceID, Rect selectionRect)
  55. {
  56. }
  57. public virtual void OnProjectWindowChanged ()
  58. {
  59. }
  60. public virtual void ProjectWindowItemOnGUI (string guid, Rect selectionRect)
  61. {
  62. }
  63. public virtual void OnModifierKeysChanged ()
  64. {
  65. }
  66. public virtual void OnGlobalEventHandler (Event e)
  67. {
  68. }
  69. public virtual void OnSearchChanged ()
  70. {
  71. }
  72. public virtual void OnPlaymodeStateChanged (PlayModeState playModeState)
  73. {
  74. }
  75. public enum PlayModeState
  76. {
  77. Playing,
  78. Paused,
  79. Stop,
  80. PlayingOrWillChangePlaymode
  81. }
  82. }

复制代码

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

  1. using UnityEditor;
  2. using UnityEngine;
  3. public class NewBehaviourScript : EditorMonoBehaviour
  4. {
  5. public override void Update ()
  6. {
  7. //Debug.Log ("每一帧回调一次");
  8. }
  9. public override void OnPlaymodeStateChanged (PlayModeState playModeState)
  10. {
  11. //Debug.Log ("游戏运行模式发生改变, 点击 运行游戏 或者暂停游戏或者 帧运行游戏 按钮时触发: " + playModeState);
  12. }
  13. public override void OnGlobalEventHandler (Event e)
  14. {
  15. //Debug.Log ("全局事件回调: " + e);
  16. }
  17. public override void HierarchyWindowItemOnGUI (int instanceID, Rect selectionRect)
  18. {
  19. //        Debug.Log (string.Format ("{0} : {1} - {2}", EditorUtility.InstanceIDToObject (instanceID), instanceID, selectionRect));
  20. }
  21. public override void OnHierarchyWindowChanged ()
  22. {
  23. Debug.Log ("层次视图发生变化");
  24. }
  25. public override void OnModifierKeysChanged ()
  26. {
  27. //        Debug.Log ("当触发键盘事件");
  28. }
  29. public override void OnProjectWindowChanged ()
  30. {
  31. //        Debug.Log ("当资源视图发生变化");
  32. }
  33. public override void ProjectWindowItemOnGUI (string guid, Rect selectionRect)
  34. {
  35. //根据GUID得到资源的准确路径
  36. //Debug.Log (string.Format ("{0} : {1} - {2}", AssetDatabase.GUIDToAssetPath (guid), guid, selectionRect));
  37. }
  38. }

复制代码

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

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

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

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

  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. 在eclipse中使用JDBC连接MySQL5.7.24
  2. neo4j CQL语句
  3. 网络安全用python吗_使用Python进行网络安全渗透——密码攻击测试器
  4. C#LeetCode刷题之#720-词典中最长的单词(Longest Word in Dictionary)
  5. 解析Tensorflow官方PTB模型的demo
  6. POJ 3630 Phone List [Trie]
  7. MLA 格式引用怎么做好分析?
  8. 单独上线音乐直播APP,“LOOK直播”能给网易云音乐带来什么?
  9. 使用binlog备份恢复myqsl数据
  10. 手把手教你用Arcgis绘制地图【热力图】
  11. 搞定计算机网络的常见面试问题
  12. 阿里云数加案例-美柚
  13. Flow是如何解决背压问题的
  14. 阿里巴巴鸿蒙系统,都说鸿蒙系统要比阿里YunOS更容易成功,到底容易在哪些方面?...
  15. source insight 4.0 配色方案及配置方法
  16. 关于数据恢复软件怎么使用的
  17. 16WiFi上海开通:5487辆公交车覆盖免费WiFi
  18. 高通android9 lanucher3
  19. VB.NET之旅--命名空间
  20. 微控制器实验计算机组成原理,组成原理实验四 微控制器实验

热门文章

  1. 阿里云大学云计算专业欢迎加入
  2. 6天,50万!ChatGPT App 下载量远超美国 iOS 新应用的 99.99%
  3. 仿Bilibili iOS客户端
  4. 应急通信移动指挥系统解决方案,为应急救援提供有效通信保障支撑。
  5. python数组拼接字符串_Python练习题——数组拼接
  6. 【GIT】git实用指令(不定期更新)
  7. python3 GUI用户界面总结(以串口调试为例,持续改进)
  8. java-php-python-ssm芮城县十全十美火锅店点餐系统计算机毕业设计
  9. 思科网计算机网络第一章测验,思科计算机网络课程设计——第一章路由概念测试答案...
  10. 深入解析HotSpot