OnGUI是Unity上一個(gè)時(shí)代的UI系統(tǒng)蛇更,而現(xiàn)在運(yùn)行時(shí)的UI系統(tǒng)已經(jīng)被UGUI取代李茫,但是Editor的UI還是在用老的這一套GUI系統(tǒng)。比如unity編輯器里的所有窗口谆棺,布局,按鈕,拖動(dòng)條改淑、滾動(dòng)等等都是用GUI來寫的碍岔。GUI提供了一套Event事件系統(tǒng),雖然不能模擬它的事件(其實(shí)是可以發(fā)的 EditorWindow.SendEvent )朵夏,但是確可以進(jìn)行攔截蔼啦。
比如說:
1.限制Hierarchy視圖的樹狀結(jié)構(gòu)。(讓某些對象不可隨意移動(dòng)層次結(jié)構(gòu))
2.限制Project里的資源不能任意拖動(dòng)(限制美術(shù)只能把一些資源放在規(guī)定的文件夾下面)
3.限制GUI中按鈕的點(diǎn)擊
4.拖拽資源或者對象綁定的時(shí)候執(zhí)行一些自己的代碼 等等
把下面這段代碼拷貝到你的工程中仰猖,你會(huì)發(fā)現(xiàn)你的Hierarchy視圖還有Porject視圖中的所有對象不能任意拖動(dòng)了捏肢。。
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就是獲取當(dāng)前的事件,所有的事件都是由我們自己手動(dòng)操作鼠標(biāo)或者鍵盤產(chǎn)生的躏升。比如 按下辩棒、抬起、移動(dòng)膨疏、拖拽一睁、右鍵、滾動(dòng)成肘、粘貼卖局、復(fù)制、選擇双霍。全選 等 事件砚偶、詳細(xì)的事件類型在這里。 http://docs.unity3d.com/ScriptReference/EventType.html
代碼中只需要去判斷當(dāng)前事件的類型洒闸,假如不想讓這個(gè)事件滲透執(zhí)行下去染坯,那么就調(diào)用e.Use() 方法。這個(gè)方法的意思就是把這個(gè)事件刪除了丘逸,不讓后面的代碼能監(jiān)聽到它单鹿。
剩下的就是配合Selection.objects和 DragAndDrop.objectReferences 以及Input.mousePostion 一類的方法 來判斷當(dāng)前操作的對象,通過邏輯來靈活的判斷是否要執(zhí)行事件深纲≈俪或者是執(zhí)行事件的同時(shí)在執(zhí)行一些自己的代碼。湃鹊。
OK Editor下的就說完了儒喊,我們再說說運(yùn)行時(shí)的。如下圖所示币呵,我可以通過事件攔截的方法讓這個(gè)按鈕永遠(yuǎn)得不到點(diǎn)擊的響應(yīng)怀愧。
代碼是這樣的
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)聽事件類型的,因?yàn)橄胱鲆粋€(gè)好用的編輯器真的離不開這些。 最后歡迎大家在下面給我留言芯义,我們一起討論GUI的事件哈垢。