EditorWindow类的OnGUI函数只会在窗口焦点处于Editor窗口上的时候才会运行。如果希望焦点不在Editor窗口上的时候,它也能实时更新,可以实现以下方法:

OnDestroy OnDestroy is called when the EditorWindow is closed.
OnFocus Called when the window gets keyboard focus.
OnGUI Implement your own editor GUI here.
OnHierarchyChange Called whenever the scene hierarchy has changed.
OnInspectorUpdate OnInspectorUpdate is called at 10 frames per second to give the inspector a chance to update.
OnLostFocus Called when the window loses keyboard focus.
OnProjectChange Called whenever the project has changed.
OnSelectionChange Called whenever the selection has changed.
Update Called multiple times per second on all visible windows.

但是,如果Editor窗口被贴到大窗口上后,选择和它平级的窗口,从而隐藏了Editor窗口,这样OnGUI函数仍然无法调用。所以,我们为了实现更有效的后台处理,可以采用继承一个自己写的EditorUpdate类的方式。

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

然后在另一个脚本中继承这个类,并重载Start和Update等方法,在这些方法中实现后台逻辑,就可以后台更新了。

  1. using UnityEngine;
  2. using System.Collections;
  3.  
  4. public class UpdaterTest :EditorMonoBehaviour
  5. {
  6. public override void Update ()
  7. {
  8.  
  9. }
  10. }

【Unity3D】用继承EditorUpdater类来实现Editor模式下的后台处理的更多相关文章

  1. Unity3D Editor模式下批量修改prefab

    最经遇到一个需要批量修改已经做好的prefab的问题,查了一些资料最终实现了但是还是不够完美,通过学习也发现unity的编辑器功能还是非常强大的.废话不多说直接上代码: [ExecuteInEditM ...

  2. 二、Unity Editor模式下,操作选中对象

    使用Unity提供的工具类 UnityEditor.Selection public static GameObject activeGameObject public static UnityEng ...

  3. Editor模式下实例化Prefab

    PrefabUtility.InstantiatePrefab//需要关联 GameObject.Instantiate//不需要关联

  4. unity editor模式下读取文件夹资源

    string path = EditorUtility.OpenFolderPanel("Load png Textures", "", "" ...

  5. 继承MonoBehaviour类的优缺点和相关报错

    Unity3D文档里虽然说所有脚本继承MonoBehaviour类,但如果你想自定义类,就可以不用继承MonoBehaviour,但是这个类只能调用其中的方法和属性,无法拖到场景的物体中使用. 所有从 ...

  6. 窥探Swift之类的继承与类的访问权限

    上一篇博客<窥探Swift之别具一格的Struct和Class>的博客可谓是给Swift中的类开了个头.关于类的内容还有很多,今天就来搞一下类中的继承以及类的访问权限.说到类的继承,接触过 ...

  7. 继承Thread类

    Thread类在包java.lang中,从这个类中实例化的对象代表线程,启动一个新线程需要建立Thread实例,Thread类中常用的两个构造方法如下: (1)public Thread(String ...

  8. C++中虚继承派生类构造函数的正确写法

    最近工作中某个软件功能出现了退化,追查下来发现是一个类的成员变量没有被正确的初始化.这个问题与C++存在虚继承的情况下派生类构造函数的写法有关.在此说明一下错误发生的原因,希望对更多的人有帮助. 我们 ...

  9. C#中是否可以继承String类

    C#中是否可以继承String类? 答:String类是sealed类故不可以继承. 当对一个类应用 sealed 修饰符时,此修饰符会阻止其他类从该类继承. 在下面的示例中,类 HoverTree ...

随机推荐

  1. 机器学习:k-NN算法(也叫k近邻算法)

    一.kNN算法基础 # kNN:k-Nearest Neighboors # 多用于解决分裂问题 1)特点: 是机器学习中唯一一个不需要训练过程的算法,可以别认为是没有模型的算法,也可以认为训练数据集 ...

  2. 问题7:如何实现用户的历史记录功能(最多n条)

    实例:制作猜字游戏,添加历史记录功能,显示用户最近猜过的数字 解决方案:使用容量为n的队列存储历史记录 使用标准库colections中的deque,一个双端循环队列 程序退出前,可以使用pickle ...

  3. python 基础 序列化

    转自https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00138683221577 ...

  4. Java 数据类型间的相互转化

    Java中常见基本数据类型包括(String除外[引用]) Date(int year,int month,int day,int hour,int minute,int sec); String 格 ...

  5. js中object、字符串与正则表达式的方法

    对象 1.object.hasOwnProperty(name) 检测object是否包含一个名为name的属性,那么hasOwnProperty方法返回true,但是不包括其原型上的属性. 正则表达 ...

  6. SpringMVC 学习笔记(请求方法的返回值和参数)

    在用注解对配置 处理器时,一般是一个方法处理一个请求,不同方法的返回类型有着不同的意义. 返回值为 ModelAndView 类型 ModelAndView 是Model 和 View 的一个集合类型 ...

  7. Spring 3.x 企业引用开发实战(陈雄华/林开雄)

    目录 ... 第一章:Spring概述 IoC:BeanFactory.Context.El(SpringEL表达式) AOP:允许JVM虚拟机启动时使用代理类在运行时期修改指定类的字节码,改变一个类 ...

  8. 关于ArcGis for javascrept之Map类

    ArcGis for javascrept_ESRI_Map类:  1. 构造方法:esri.Map(); 参数: extent 如果设置了该选项,一旦这个选项的投影被设置,那么所有的图层都在定义的投 ...

  9. php小块代码

    //页面本身网址 "http://".$_SERVER["HTTP_HOST"].preg_replace("/[^\/]+$/",&quo ...

  10. 使用form 组件写一个用户注册,并用 bootstrap渲染

    需求:使用form组件,写一个用户注册系统,包含用户名, 密码, 确认密码,手机号,性别,爱好,注册.并用bootsrap渲染,成果如下: 首先创建一个django 项目.然后在连接pymysql数据 ...