Unity中EventTrigger的幾種使用操作
說(shuō)起EventTrigger事件觸發(fā)器,它的使用可以說(shuō)是無(wú)處不在,EventTrigger繼承了很多的事件接口,這些接口對(duì)我們開(kāi)發(fā)是十分有用的。
弄懂EventTrigger在以后開(kāi)發(fā)游戲過(guò)程中可以說(shuō)是事半功倍。
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中的類,
接下來(lái)用不同的方式來(lái)看EventTrigger的用法:
1.通過(guò)編輯器中添加
在Inspector中添加EventTrigger的componnent組件,然后點(diǎn)擊Add New Event Type按鈕添加一個(gè)基本的事件,主基本事件如下圖:

當(dāng)我們選擇一個(gè)事件的時(shí)候,就相當(dāng)于將要于此事件綁定了,例如當(dāng)我們選擇Pointer Click的時(shí)候,綁定了這個(gè)組件的物體將接受Pointer Click 事件的消息,當(dāng)我們?cè)谖矬w上按下鼠標(biāo)的時(shí)候,(當(dāng)然空間中的物體我們是無(wú)法通過(guò)鼠標(biāo)點(diǎn)擊的,但是當(dāng)我們可以通過(guò)射線碰撞的方法,來(lái)實(shí)現(xiàn)Pointer Enter,Pointer Exit等事件的觸發(fā))這里我們用來(lái)綁定這個(gè)EventTrigger 的是一個(gè)UI Panel 這樣便可以讓它接受我們自定義的單擊事件了

這里的1是我們之前選擇的Pointer click 事件,2處是將我們3處要執(zhí)行我們想要的觸發(fā)函數(shù)所在腳本的gameobject托入這里,然后才能選擇這個(gè)gameobject對(duì)象上的腳本來(lái)執(zhí)行,當(dāng)點(diǎn)擊了panel的時(shí)候就會(huì)觸發(fā)MyClick這個(gè)函數(shù)(這是我們自定義的函數(shù)),編輯器中的方法基本就是這樣了。
2.接下來(lái)便是如何在腳本中實(shí)現(xiàn)剛才的功能
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 ("點(diǎn)擊");
}}
將這個(gè)腳本添加到Panel上面,然后運(yùn)行,點(diǎn)擊Panel,便打印出了“點(diǎn)擊”。
補(bǔ)充:Unity中使用EventTrigger點(diǎn)擊場(chǎng)景中的物體
突然發(fā)現(xiàn),原來(lái)以為做一遍以為就不會(huì)忘記的東西慢慢就忘了,看來(lái)隨著年齡的增大記憶力還是慢慢不如從前 了。那就勤動(dòng)手,把一些需要的東西記下來(lái)吧。
今天使用unity的EventTrigger組件,實(shí)現(xiàn)點(diǎn)擊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);
然后我們?cè)贠nPointerDown方法中加一個(gè)輸出,方便測(cè)試:
void OnPointerDown(BaseEventData data)
{
Debug.LogError("OnPointerDown");
}
面板上已經(jīng)有EventSystem,然而經(jīng)過(guò)測(cè)試,點(diǎn)擊無(wú)效,測(cè)試點(diǎn)擊UI沒(méi)問(wèn)題
此時(shí)才發(fā)現(xiàn)是相機(jī)上漏加Physics Raycaster腳本,添加之后,點(diǎn)擊測(cè)試正常。
看來(lái)以后還得多動(dòng)手,需要的便記下來(lái)。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
C#實(shí)現(xiàn)Bitmap類型與Byte[]類型相互轉(zhuǎn)化的示例詳解
在C#編程中,Bitmap類型和Byte[]類型之間的相互轉(zhuǎn)化是圖像處理和數(shù)據(jù)傳輸中常見(jiàn)的需求,Bitmap類型表示一個(gè)位圖圖像,而B(niǎo)yte[]類型則是一個(gè)字節(jié)數(shù)組,本文將詳細(xì)介紹如何在這兩種類型之間進(jìn)行相互轉(zhuǎn)化,需要的朋友可以參考下2024-07-07
C#程序啟動(dòng)項(xiàng)的設(shè)置方法
這篇文章主要為大家詳細(xì)介紹了C#程序啟動(dòng)項(xiàng)的設(shè)置方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11
使用C#與SQL Server數(shù)據(jù)庫(kù)進(jìn)行交互的詳細(xì)步驟
在C#中與數(shù)據(jù)庫(kù)進(jìn)行交互,通常使用ADO.NET(ActiveX Data Objects .NET)框架,ADO.NET是.NET Framework中用于數(shù)據(jù)訪問(wèn)的一組類庫(kù),它提供了多種用于連接和操作數(shù)據(jù)庫(kù)的方法,以下是使用C#與SQL Server數(shù)據(jù)庫(kù)進(jìn)行交互的詳細(xì)步驟,需要的朋友可以參考下2024-08-08
C#實(shí)現(xiàn)獲取文件大小并進(jìn)行比較
這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)獲取文件大小進(jìn)行單位轉(zhuǎn)換與文件大小比較功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-03-03
Winform學(xué)生信息管理系統(tǒng)登陸窗體設(shè)計(jì)(1)
這篇文章主要為大家詳細(xì)介紹了Winform學(xué)生信息管理系統(tǒng)登陸窗體設(shè)計(jì)思路,感興趣的小伙伴們可以參考一下2016-05-05
.NET使用C#導(dǎo)入Excel文件數(shù)據(jù)到數(shù)據(jù)庫(kù)
將Excel文件中的數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫(kù)中不僅能夠提升數(shù)據(jù)處理的效率和準(zhǔn)確性,還能極大地促進(jìn)數(shù)據(jù)分析和決策制定的過(guò)程,本文將介紹如何在.NET平臺(tái)使用C#導(dǎo)入Excel文件數(shù)據(jù)到數(shù)據(jù)庫(kù)中,需要的可以參考下2024-12-12

