unity--監聽Hierachy、Project等檢視結構變化的事件
最近我發現了一個更好的方法來監聽Project檢視變化,歡迎大家前來看看 Unity--監聽Project檢視結構變化的事件
以前就有人問我怎麼監聽Hierarchy檢視中建立或刪除變化的事件,當時因為有別的事情就沒研究這塊。剛好最近有這一類的需求我就學習學習。網上發現了一個日本人寫的文件,實現的原理很有意思,內容不錯我就翻譯一下。
原文:http://anchan828.hatenablog.jp/entry/2013/12/29/015306
請注意一定把這兩個監聽的指令碼放在Editor資料夾下。
先是基類。
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 |
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直接就可以監聽。
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 |
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)); } } |