[轉(zhuǎn)]Editor的GUI的事件攔截

OnGUI是Unity上一個時代的UI系統(tǒng),而現(xiàn)在運行時的UI系統(tǒng)已經(jīng)被UGUI取代,但是Editor的UI還是在用老的這一套GUI系統(tǒng)。比如unity編輯器里的所有窗口,布局,按鈕,拖動條、滾動等等都是用GUI來寫的。GUI提供了一套Event事件系統(tǒng),雖然不能模擬它的事件(其實是可以發(fā)的 EditorWindow.SendEvent ),但是確可以進行攔截。

比如說:

1.限制Hierarchy視圖的樹狀結構。(讓某些對象不可隨意移動層次結構)

2.限制Project里的資源不能任意拖動(限制美術只能把一些資源放在規(guī)定的文件夾下面)

3.限制GUI中按鈕的點擊

4.拖拽資源或者對象綁定的時候執(zhí)行一些自己的代碼 等等

把下面這段代碼拷貝到你的工程中,你會發(fā)現(xiàn)你的Hierarchy視圖還有Porject視圖中的所有對象不能任意拖動了。。

using UnityEngine;
using UnityEditor;
using System.Collections;
using System;
 
public class MyEditor
{
 
    [InitializeOnLoadMethod]
    static void Start ()
    {
        Action OnEvent = delegate {
            Event e = Event.current;
 
            switch (e.type) {                
//          case EventType.mouseDown:                
//              Debug.Log ("mousedown");
//              e.Use ();
//              break;
//          case EventType.mouseUp:            
//              Debug.Log ("mouseup");
//              e.Use ();
//              break;
//          case EventType.MouseMove:
//              Debug.Log ("move");
//              e.Use ();
//              break;
            case EventType.DragPerform:
                Debug.Log ("DragPerform");
                e.Use ();
                break;
            case EventType.DragUpdated:
                Debug.Log ("DragUpdated");
                e.Use ();
                break;
            case EventType.DragExited:
                Debug.Log ("DragExited");
                e.Use ();
                break;
            }
        };
 
 
        EditorApplication.hierarchyWindowItemOnGUI = delegate(int instanceID, Rect selectionRect) {
 
            OnEvent();
 
        };
 
        EditorApplication.projectWindowItemOnGUI = delegate(string guid, Rect selectionRect) {
    
            OnEvent();
        };
    
    }
}

首先獲取事件必須在OnGUI中完成,Editor下也可以在類似的XXXOnGUI中完成。

Event.current就是獲取當前的事件,所有的事件都是由我們自己手動操作鼠標或者鍵盤產(chǎn)生的。比如 按下、抬起、移動、拖拽、右鍵、滾動、粘貼、復制、選擇。全選 等 事件、詳細的事件類型在這里。 http://docs.unity3d.com/ScriptReference/EventType.html

代碼中只需要去判斷當前事件的類型,假如不想讓這個事件滲透執(zhí)行下去,那么就調(diào)用e.Use() 方法。這個方法的意思就是把這個事件刪除了,不讓后面的代碼能監(jiān)聽到它。

剩下的就是配合Selection.objects和 DragAndDrop.objectReferences 以及Input.mousePostion 一類的方法 來判斷當前操作的對象,通過邏輯來靈活的判斷是否要執(zhí)行事件?;蛘呤菆?zhí)行事件的同時在執(zhí)行一些自己的代碼。。

OK Editor下的就說完了,我們再說說運行時的。如下圖所示,我可以通過事件攔截的方法讓這個按鈕永遠得不到點擊的響應。


代碼是這樣的

void OnGUI()
    {
        Event e = Event.current;
 
        if (e != null) {
            switch (e.type) { 
            case EventType.mouseDown:        
                e.Use ();
                break;
 
            }
        }
        if (GUILayout.Button ("1")) {
            Debug.Log ("cilick");
        }
    }

總體來說我覺得Editor下還是很有必要監(jiān)聽事件類型的,因為想做一個好用的編輯器真的離不開這些。 最后歡迎大家在下面給我留言,我們一起討論GUI的事件。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 我們一生中,總有一些無法言說的艱難時刻 親愛的,如果你過得不順利,請記得 你在嚎啕大哭的時候 你的敵人在彈冠相慶 ...
    西門吹雪一一匠心做燈人閱讀 178評論 0 0
  • 昨晚出去喝酒時 還沒下雨 醒來后 卻已在家里床上 窗外雨聲滂沱 只有頭疼還在告訴我 昨晚是真實 人生有多少快樂 就...
    天線君閱讀 308評論 0 0
  • 感受:愜意、舒適 經(jīng)歷:今天在家陪小寶。趁小寶自得其樂玩耍時,我把臥室床單換了,窗臺和地板擦得干干凈凈,打理好蘭草...
    小嬪_1e27閱讀 161評論 2 1
  • 朋友說!我不喜歡我現(xiàn)在的生活,我不喜歡現(xiàn)在的工作環(huán)境和性質(zhì),我想做我喜歡的工作,喜歡過我想過的生活,可現(xiàn)實往往是相...
    Niny姐姐閱讀 346評論 0 0
  • (一) 小學的時候曾經(jīng)學過一篇課文《數(shù)星星的孩子》 課文內(nèi)容講的是:夏天的晚上,滿天的星星。一個孩子靠著奶奶坐在院...
    守望小確幸閱讀 663評論 2 8

友情鏈接更多精彩內(nèi)容