Unity中UnityEngine.EventSystems 事件系統(tǒng) 鼠標(biāo)互動(dòng)接口 IPointer系列簡(jiǎn)介(1)

今天和大家分享位于UnityEngine.EventSystems 的一系列接口,功能包括鼠標(biāo)點(diǎn)擊,鼠標(biāo)按下與松開,鼠標(biāo)拖動(dòng)等.
這一系列的接口默認(rèn)只能作用在開啟了 Raycast Target (默認(rèn)開啟)的 UI 元素身上,

當(dāng)然,既然是射線檢測(cè),那么只要目標(biāo)物體有碰撞體,那么就有辦法啟用這個(gè)接口,只需在相機(jī)上添加 Physics Raycaster 或者 Physics 2D Raycaster 組件即可.2D和3D并不通用,但可共用.

以上是接口前期準(zhǔn)備,接下來(lái)開始正式介紹:
IPointerDownHandler 接口,可響應(yīng)鼠標(biāo)在自身碰撞體范圍內(nèi)按下事件
需要實(shí)現(xiàn) void OnPointerDown(PointerEventData eventData) 方法.
IPointerUpHandler 接口,可響應(yīng)鼠標(biāo)在自身碰撞體范圍內(nèi)松開事件
需要實(shí)現(xiàn)?void OnPointerUp(PointerEventData eventData) 方法.
IPointerClickHandler?接口,可響應(yīng)鼠標(biāo)在自身碰撞體范圍內(nèi)點(diǎn)擊事件,什么叫點(diǎn)擊呢,就是你在碰撞體范圍內(nèi)按下了,然后又在范圍內(nèi)松開了,這中間是可以移動(dòng)的,哪怕你移出范圍了,只要你松開的時(shí)候回來(lái)就算.
需要實(shí)現(xiàn)?void?OnPointerClick(PointerEventData eventData)?方法.
IPointerEnterHandler?接口,可響應(yīng)鼠標(biāo)進(jìn)入自身碰撞體范圍事件
需要實(shí)現(xiàn)?void?OnPointerEnter(PointerEventData eventData)?方法.
IPointerExitHandler?接口,可響應(yīng)鼠標(biāo)離開自身碰撞體范圍事件
需要實(shí)現(xiàn)?void?OnPointerExit(PointerEventData eventData)?方法.
IPointerMoveHandler?接口,可響應(yīng)鼠標(biāo)在自身碰撞體范圍內(nèi)移動(dòng)事件
需要實(shí)現(xiàn)?void?OnPointerMove(PointerEventData eventData)?方法.
IScrollHandler接口,可響應(yīng)鼠標(biāo)在自身碰撞體范圍內(nèi)滑動(dòng)滾輪事件
需要實(shí)現(xiàn)?void OnScroll(PointerEventData eventData) 方法.

上面是一個(gè)系列(算是我自己分的),接下來(lái)是拖拽相關(guān)的:
IDragHandler?接口,在事件系統(tǒng)的拖拽相關(guān)中,這是個(gè)比較關(guān)鍵的接口,雖然只
需要實(shí)現(xiàn)void OnDrag(PointerEventData eventData)方法
但是其他的幾個(gè)接口在沒(méi)有他的情況下是不完整(或者不工作的),這個(gè)方法響應(yīng)的是拖拽事件,那么所謂拖拽事件,就是鼠標(biāo)按住不放的情況下移動(dòng)了,在移動(dòng)的每一幀都會(huì)觸發(fā)拖拽事件,你按著不動(dòng)了就暫停觸發(fā),繼續(xù)動(dòng)繼續(xù)觸發(fā),松開就停止觸發(fā).
IInitializePotentialDragHandler接口,檢測(cè)當(dāng)前腳本是否實(shí)現(xiàn)了前面那個(gè)IDragHandler接口,如果腳本有IDragHandler接口的話,在你按下鼠標(biāo)之后觸發(fā)本接口(觸發(fā)時(shí)機(jī)是晚于IPointerDownHandler)
需要實(shí)現(xiàn)void OnInitializePotentialDrag(PointerEventData eventData)方法
IBeginDragHandler接口,當(dāng)拖拽開始時(shí)觸發(fā),即按下鼠標(biāo)開始移動(dòng)的時(shí)候,按著不觸發(fā),動(dòng)的那一幀觸發(fā),如果腳本沒(méi)有實(shí)現(xiàn)IDragHandler接口的話不會(huì)觸發(fā).
需要實(shí)現(xiàn)void OnBeginDrag(PointerEventData eventData) 方法.
IEndDragHandler接口,當(dāng)拖拽結(jié)束時(shí)觸發(fā),松開就是結(jié)束.
需要實(shí)現(xiàn)void?OnEndDrag(PointerEventData eventData) 方法.
IDropHandler接口,既然有拖拽,那么就自然有放置,當(dāng)你正在拖拽時(shí),如果在實(shí)現(xiàn)該接口的物體的碰撞體范圍內(nèi)松開,就會(huì)觸發(fā)該接口,觸發(fā)時(shí)機(jī)早于IEndDragHandler接口.
需要實(shí)現(xiàn)void?OnDrop(PointerEventData eventData) 方法.

接下來(lái)要介紹的是和UI行為相關(guān)的幾個(gè)接口,先看圖

這張圖是默認(rèn)的 InputManager 的各個(gè)按鈕的設(shè)置,也包括了UI的按鈕,比如 Submit,Cancel.
如果你使用的是 InputSystem ,那么則需要在升級(jí)后的EventSystem組件中設(shè)置各個(gè)按鈕:

接下來(lái)的幾個(gè)接口,需要?EventSystem.current.currentSelectedGameObject 不為空才會(huì)執(zhí)行.
ICancelHandler 接口,按下UI的取消鍵時(shí)觸發(fā),默認(rèn)是 ESC.
需要實(shí)現(xiàn).void OnCancel(BaseEventData eventData);
IMoveHandler 接口,按上下左右移動(dòng)至其他UI時(shí)觸發(fā).
需要實(shí)現(xiàn) void OnMove(AxisEventData eventData);
ISelectHandler 接口,被選中時(shí)觸發(fā).
需要實(shí)現(xiàn)?void OnSelect(BaseEventData eventData);
IDeselectHandler 接口,取消被選中時(shí)觸發(fā).
需要實(shí)現(xiàn)?void OnDeselect(BaseEventData eventData);
ISubmitHandler 接口,按下確認(rèn)鍵時(shí)觸發(fā),默認(rèn)是回車.
需要實(shí)現(xiàn)?void OnSubmit(BaseEventData eventData);
IUpdateSelectedHandler 接口,當(dāng)EventSystem.current.currentSelectedGameObject?不為空的時(shí)候每一幀觸發(fā).
需要實(shí)現(xiàn)?void OnUpdateSelected(BaseEventData eventData);

事件系統(tǒng)的接口就算是介紹完了,如果看的人多的話我就出個(gè)視頻具體講講.就這樣,大家下次再見.