Unity中EventTrigger的幾種使用操作
說起EventTrigger事件觸發器,它的使用可以說是無處不在,EventTrigger繼承瞭很多的事件接口,這些接口對我們開發是十分有用的。
弄懂EventTrigger在以後開發遊戲過程中可以說是事半功倍。
namespace UnityEngine.EventSystems { [AddComponentMenu ("Event/Event Trigger")] public class EventTrigger : MonoBehaviour, IEventSystemHandler, IPointerEnterHandler, IPointerExitHandler, IPointerDownHandler, IPointerUpHandler, IPointerClickHandler, IBeginDragHandler, IInitializePotentialDragHandler, IDragHandler, IEndDragHandler, IDropHandler, IScrollHandler, IUpdateSelectedHandler, ISelectHandler, IDeselectHandler, IMoveHandler, ISubmitHandler, ICancelHandler { // // Fields // [Obsolete ("Please use triggers instead (UnityUpgradable) -> triggers", true)] public List<EventTrigger.Entry> delegates; // // Properties // public List<EventTrigger.Entry> triggers { get; set; } // // Constructors // protected EventTrigger (); // // Methods // private void Execute (EventTriggerType id, BaseEventData eventData); public virtual void OnBeginDrag (PointerEventData eventData); public virtual void OnCancel (BaseEventData eventData); public virtual void OnDeselect (BaseEventData eventData); public virtual void OnDrag (PointerEventData eventData); public virtual void OnDrop (PointerEventData eventData); public virtual void OnEndDrag (PointerEventData eventData); public virtual void OnInitializePotentialDrag (PointerEventData eventData); public virtual void OnMove (AxisEventData eventData); public virtual void OnPointerClick (PointerEventData eventData); public virtual void OnPointerDown (PointerEventData eventData); public virtual void OnPointerEnter (PointerEventData eventData); public virtual void OnPointerExit (PointerEventData eventData); public virtual void OnPointerUp (PointerEventData eventData); public virtual void OnScroll (PointerEventData eventData); public virtual void OnSelect (BaseEventData eventData); public virtual void OnSubmit (BaseEventData eventData); public virtual void OnUpdateSelected (BaseEventData eventData); // // Nested Types // [Serializable] public class Entry { public EventTriggerType eventID; public EventTrigger.TriggerEvent callback; public Entry (); } [Serializable] public class TriggerEvent : UnityEvent<BaseEventData> { public TriggerEvent (); } } }
這是官方的API中的類,
接下來用不同的方式來看EventTrigger的用法:
1.通過編輯器中添加
在Inspector中添加EventTrigger的componnent組件,然後點擊Add New Event Type按鈕添加一個基本的事件,主基本事件如下圖:
當我們選擇一個事件的時候,就相當於將要於此事件綁定瞭,例如當我們選擇Pointer Click的時候,綁定瞭這個組件的物體將接受Pointer Click 事件的消息,當我們在物體上按下鼠標的時候,(當然空間中的物體我們是無法通過鼠標點擊的,但是當我們可以通過射線碰撞的方法,來實現Pointer Enter,Pointer Exit等事件的觸發)這裡我們用來綁定這個EventTrigger 的是一個UI Panel 這樣便可以讓它接受我們自定義的單擊事件瞭
這裡的1是我們之前選擇的Pointer click 事件,2處是將我們3處要執行我們想要的觸發函數所在腳本的gameobject托入這裡,然後才能選擇這個gameobject對象上的腳本來執行,當點擊瞭panel的時候就會觸發MyClick這個函數(這是我們自定義的函數),編輯器中的方法基本就是這樣瞭。
2.接下來便是如何在腳本中實現剛才的功能
using UnityEngine; using System.Collections; using System.Collections.Generic;using UnityEngine.Events; using UnityEngine.EventSystems; public class GameManager : MonoBehaviour { void Start() { UnityAction<BaseEventData> click = new UnityAction<BaseEventData> (MyClick); EventTrigger.Entry myclick = new EventTrigger.Entry (); myclick.eventID = EventTriggerType.PointerClick; myclick.callback.AddListener (click); EventTrigger trigger = gameObject.AddComponent<EventTrigger> (); trigger.triggers.Add (myclick); } public void MyClick(BaseEventData data) { Debug.Log ("點擊"); }}
將這個腳本添加到Panel上面,然後運行,點擊Panel,便打印出瞭“點擊”。
補充:Unity中使用EventTrigger點擊場景中的物體
突然發現,原來以為做一遍以為就不會忘記的東西慢慢就忘瞭,看來隨著年齡的增大記憶力還是慢慢不如從前 瞭。那就勤動手,把一些需要的東西記下來吧。
今天使用unity的EventTrigger組件,實現點擊3D物體。
使用Unity版本:5.4
按照記憶中的方法首先添加事件:
EventTrigger et = gameObject.GetComponent<EventTrigger>(); if (et == null) { et = gameObject.AddComponent<EventTrigger>(); } et.triggers = new List<EventTrigger.Entry>(); EventTrigger.Entry enter = new EventTrigger.Entry(); enter.eventID = EventTriggerType.PointerDown; enter.callback = new EventTrigger.TriggerEvent(); UnityAction<BaseEventData> callback = new UnityAction<BaseEventData>(OnPointerDown); enter.callback.AddListener(callback); et.triggers.Add(enter);
然後我們在OnPointerDown方法中加一個輸出,方便測試:
void OnPointerDown(BaseEventData data) { Debug.LogError("OnPointerDown"); }
面板上已經有EventSystem,然而經過測試,點擊無效,測試點擊UI沒問題
此時才發現是相機上漏加Physics Raycaster腳本,添加之後,點擊測試正常。
看來以後還得多動手,需要的便記下來。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- None Found