日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/13 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 监听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等视图结构变化的事件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。