监听Hierachy、Project等视图结构变化的事件
生活随笔
收集整理的這篇文章主要介紹了
监听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 keysEditorApplication.modifierKeysChanged += OnModifierKeysChanged;// globalEventHandlerEditorApplication.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等视图结构变化的事件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaCV免费教程大全(完整JavaC
- 下一篇: Manifold 流形