Unity EventSystem 詳解(Unity Version 5.5.1)

起因:想使用UGUI給項目設(shè)計一個萬能拖拽系統(tǒng)(2d-3d劝评,3d-3d, 3d-2d)姐直,做了快兩天了,完成度99%蒋畜,但就是有點小BUG無法解決声畏,天氣又冷,煩惱姻成。
靜下心來插龄,覺得還是對unity 的事件系統(tǒng)不熟悉,今晚坐下來讀了讀官網(wǎng)文檔(終于)科展,收獲不小均牢,寫在這里,也算是一個記錄:

Unity EventSystem

  • Message System
  • Input Modules
  • Supported Events
  • Raycasters

1. Message System(改進(jìn)的消息系統(tǒng))

基本上可以看成是以前SendMessage的升級版才睹。

使用方法(照抄官網(wǎng)):

step1. 聲明一個接口徘跪,繼承自IEventSystemHandler
public interface ICustomMessageTarget : IEventSystemHandler
{
    // functions that can be called via the messaging system
    void Message1();
    void Message2();
}
step2. 實現(xiàn)這個接口 , 把這個腳本掛在某個物體上,這里假設(shè)為物體AAA
public class CustomMessageTarget : MonoBehaviour, ICustomMessageTarget
{
    public void Message1()
    {
        Debug.Log ("Message 1 received");
    }

    public void Message2()
    {
        Debug.Log ("Message 2 received");
    }
}
step3. 在任何腳本中使用ExecuteEvents靜態(tài)類發(fā)送Message砂竖,來執(zhí)行接口中定義的方法
//target should be AAA
ExecuteEvents.Execute<ICustomMessageTarget>(target, null, (x,y)=>x.Message1());

注意 : step3里的Excute泛型方法真椿,有3個參數(shù),第一個參數(shù)是發(fā)送message的gameobject對象乎澄,只有當(dāng)對象上有IEventSystemHandler實現(xiàn)類的時候才可以突硝,這個例子中自然就是AAA物體。
還要注意 : ExecuteEvents靜態(tài)類還有其他方法:

## Static Functions

EventSystems.ExecuteEvents.CanHandleEvent    Can the given GameObject handle the IEventSystemHandler of type T. 
EventSystems.ExecuteEvents.Execute     Execute the event of type T : IEventSystemHandler on GameObject.
EventSystems.ExecuteEvents.ExecuteHierarchy  Recurse up the hierarchy calling Execute<T> until there is a GameObject that can handle the event. 
EventSystems.ExecuteEvents.GetEventHandler  Traverse the object hierarchy starting at root, and return the GameObject which implements the event handler of type <T> 
EventSystems.ExecuteEvents.ValidateEventData  Attempt to convert the data to type T. If conversion fails an ArgumentException is thrown.

名字解釋都比較直白置济,就不翻譯了解恰。比如那個EventSystems.ExecuteEvents.ExecuteHierarchy, 是遞歸尋找適合的gameobject浙于,并執(zhí)行方法护盈。

說實話,比以前的SendMessage科學(xué)了不少羞酗,以前只能在Hierarchy里上下求索腐宋,現(xiàn)在是有目的的尋找了。
但....我看來也就僅此而已了檀轨,SendMessage我在實際工程中從來都沒用過胸竞,這個估計也不會用。為什么参萄?有了System.Action誰還用這個...

2. Input Modules

此部分略卫枝,大致就是unity支持所有的輸入方式,包括鍵盤啦讹挎,手柄啦校赤,觸摸啦等等吆玖,balabala...

3. Supported Events(支持的輸入事件)

這部分就比較重要了,unity事件系統(tǒng)支持以下17種輸入事件

事件接口 含義
IPointerEnterHandler pointer進(jìn)入
IPointerExitHandler pointer離開
IPointerDownHandler pointer按下
IPointerUpHandler pointer抬起
IPointerClickHandler pointer按下和抬起
IInitializePotentialDragHandler 可拖拽物體被發(fā)現(xiàn)马篮,可用來初始化一些變量
IBeginDragHandler 開始拖拽
IDragHandler 拖拽中
IEndDragHandler 拖拽結(jié)束時 (when)
IDropHandler 拖拽結(jié)束位置(where)
IScrollHandler 鼠標(biāo)滾輪
IUpdateSelectedHandler 選中物體時沾乘,持續(xù)發(fā)送
ISelectHandler 物體變?yōu)楸贿x擇
IDeselectHandler 物體變?yōu)槿∠x擇
IMoveHandler 物體移動(左右上下等)
ISubmitHandler submit(提交)按鈕按下
ICancelHandler cancel(取消)按鈕按下

注意: 這里的“pointer”可以是鼠標(biāo)、touch等一切unity支持的類型

那也就意味著积蔚,我們終于可以在PC和移動端共用一套代碼了

4. Raycasters(射線們)

這也是另外一個重要的點:決定了unity對何種輸入方式進(jìn)行響應(yīng):

射線類型 含義
Graphic Raycaster UI使用
Physics 2D Raycaster 2D 物體組件使用意鲸,如 BoxCollider2D等
Physics Raycaster 3D物體使用(UI其實也能使用)

5. Practice - 練習(xí)和測試

我們來建個簡單的場景:

  1. 場景中增加一個空物體,命名為 EventSystem尽爆,添加EventSystem組件怎顾,點擊組件上的Add Default Input Modules按鈕
  2. 場景中的攝像機上,添加Physics Raycaster組件
  3. 場景中建立一個3d的 Cude漱贱, 和一個2d的image
  4. 將以下腳本拖給Cude和Image:
using UnityEngine;
using UnityEngine.EventSystems;

public class SupportedEventsTest : MonoBehaviour,
    IPointerEnterHandler, IPointerExitHandler, IPointerDownHandler, IPointerUpHandler,
    IPointerClickHandler, IInitializePotentialDragHandler, IBeginDragHandler, IDragHandler,
    IEndDragHandler, IDropHandler, IScrollHandler, IUpdateSelectedHandler,
    ISelectHandler, IDeselectHandler, IMoveHandler, ISubmitHandler, ICancelHandler

{
    public void OnBeginDrag(PointerEventData eventData)
    {
        Debug.Log("OnBeginDrag");
    }

    public void OnCancel(BaseEventData eventData)
    {
        Debug.Log("OnCancel");
    }

    public void OnDeselect(BaseEventData eventData)
    {
        Debug.Log("OnDeselect");
    }

    public void OnDrag(PointerEventData eventData)
    {
        Debug.Log("OnDrag");
    }

    public void OnDrop(PointerEventData eventData)
    {
        Debug.Log("OnDrop");
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        Debug.Log("OnEndDrag");
    }

    public void OnInitializePotentialDrag(PointerEventData eventData)
    {
        Debug.Log("OnInitializePotentialDrag");
    }

    public void OnMove(AxisEventData eventData)
    {
        Debug.Log("OnMove");
    }

    public void OnPointerClick(PointerEventData eventData)
    {
        Debug.Log("OnPointerClick");
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        Debug.Log("OnPointerDown");
    }

    public void OnPointerEnter(PointerEventData eventData)
    {
        Debug.Log("OnPointerEnter");
    }

    public void OnPointerExit(PointerEventData eventData)
    {
        Debug.Log("OnPointerExit");
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        Debug.Log("OnPointerUp");
    }

    public void OnScroll(PointerEventData eventData)
    {
        Debug.Log("OnScroll");
    }

    public void OnSelect(BaseEventData eventData)
    {
        Debug.Log("OnSelect");
    }

    public void OnSubmit(BaseEventData eventData)
    {
        Debug.Log("OnSubmit");
    }

    public void OnUpdateSelected(BaseEventData eventData)
    {
        Debug.Log("OnUpdateSelected");
    }


}

運行游戲槐雾,我們可以看到,3d和2d物體都可以相應(yīng)事件系統(tǒng)幅狮,這是由于我們給攝像機添加了Physics Raycaster組件募强。如果你換成Graphic Raycaster,那Cube是不會響應(yīng)的崇摄。

好擎值,今天就寫到這,寫的還算整齊逐抑,睡覺了鸠儿。
╮(╯3╰)╭睡眠不足,不熬夜不追劇( ̄▽ ̄)*

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末厕氨,一起剝皮案震驚了整個濱河市进每,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌命斧,老刑警劉巖田晚,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異国葬,居然都是意外死亡贤徒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門汇四,熙熙樓的掌柜王于貴愁眉苦臉地迎上來接奈,“玉大人,你說我怎么就攤上這事船殉。” “怎么了斯嚎?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵利虫,是天一觀的道長挨厚。 經(jīng)常有香客問我,道長糠惫,這世上最難降的妖魔是什么疫剃? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮硼讽,結(jié)果婚禮上巢价,老公的妹妹穿的比我還像新娘。我一直安慰自己固阁,他們只是感情好壤躲,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著备燃,像睡著了一般碉克。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上并齐,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天漏麦,我揣著相機與錄音,去河邊找鬼况褪。 笑死撕贞,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的测垛。 我是一名探鬼主播捏膨,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赐纱!你這毒婦竟也來了脊奋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤疙描,失蹤者是張志新(化名)和其女友劉穎诚隙,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體起胰,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡久又,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了效五。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片地消。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖畏妖,靈堂內(nèi)的尸體忽然破棺而出脉执,到底是詐尸還是另有隱情,我是刑警寧澤戒劫,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布半夷,位于F島的核電站婆廊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏巫橄。R本人自食惡果不足惜淘邻,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望湘换。 院中可真熱鬧宾舅,春花似錦、人聲如沸彩倚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽署恍。三九已至崎溃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間盯质,已是汗流浹背袁串。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留呼巷,地道東北人囱修。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像王悍,于是被迫代替她去往敵國和親破镰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容