1. 程式人生 > >unity--監聽Hierachy、Project等檢視結構變化的事件

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));

    }

}