Unity 實(shí)現(xiàn)給物體動(dòng)態(tài)添加事件
介紹一個(gè)方法給物體動(dòng)態(tài)的添加事件(點(diǎn)擊 拖拽等)
using System.Events;
using System.EventSystems;
//_go is the gameobject which need add event
//_go 是物體,因?yàn)镋ventTrigger是unity中的一個(gè)組件,我們要用添加組件的方式來(lái)給物體添加事件觸發(fā)組件
//_type is the EventTriggerType(point , drag , clickdown......
//_type 是要添加的事件觸發(fā)類型,這是一個(gè)內(nèi)置枚舉
//_action is the funtion
//_action 這里之前寫的時(shí)候可能是沒(méi)有注意就寫上了funtion了,其實(shí)這應(yīng)該是一個(gè)委托一個(gè)UnityAction類型的委托
void AddTriggerEvent (GameObject _go , EventTriggrtType _type , UnityAction<BaseEventData> _action)
{
// 查看是否已經(jīng)有這個(gè)組件
EventTrigger trigger = _go.GetComponent<EventTrigger>();
// 如果沒(méi)有就添加組件
if (trigger == null)
{
trigger = _go.AddComponent<EventTrigger>();
}
//2021年2月20日更新
//沒(méi)有必要加這句話,因?yàn)槟闶褂玫闹皇且粋€(gè)引用,并不是屬性
//if (trigger.triggers.Count==0)
//{
// trigger.triggers = new List<EventTrigger.Entry>();
//}
//新建觸發(fā)實(shí)例
EventTrigger.Entry entry = new EventTrigger.Entry();
// 之前我在項(xiàng)目里寫的時(shí)候是直接添加的方法,沒(méi)有用傳值的方式,所以這里寫的有些累贅
//UnityAction<BaseEventData> callBack = new UnityAction<BaseEventData>(_action);
// 修改之前累贅寫法
//entry.callback.AddListener(callBack);
entry.callback.AddListener(_action);
//設(shè)置實(shí)例類型
entry.eventID = _type;
// 將實(shí)例添加到觸發(fā)列表中
trigger.triggers.Add(entry);
}
2021年2月20日更新
看到自己之前寫的博客太過(guò)簡(jiǎn)略,也沒(méi)有注意事項(xiàng),重新編輯一下,我現(xiàn)在重新加上了注釋,對(duì)腳本進(jìn)行了部分修改,然后下面講一下注意事項(xiàng)
1.這個(gè)事件觸發(fā)是使用的unity內(nèi)置的事件觸發(fā)系統(tǒng),所以在使用的時(shí)候一定要有

這兩個(gè)組件,就是你在場(chǎng)景里新建UI組件的時(shí)候自己新建的那個(gè)東西
2.如果是UI的話,可以直接添加,但如果不是UI的話,確保兩件事
1) 確保相機(jī)上有射線組件

這兩個(gè)組件分別對(duì)應(yīng)3D物體和2D物體
2)要被檢測(cè)的組件一定要有collder組件
只有這樣才能保證eventtrigger的正確實(shí)現(xiàn)
補(bǔ)充:Unity 動(dòng)態(tài)給物體添加EventTrigger事件
給掛載該腳本的物體自動(dòng)添加 EventTrigger 組件:
[RequireComponent(typeof(EventTrigger))]
public class ModelComponent : MonoBehaviour
{
}
給物體動(dòng)態(tài)添加 EventTrigger 的觸發(fā)事件:
private void AddEventTriggerFun(EventTriggerType eventTriggerType, UnityEngine.Events.UnityAction<BaseEventData> unityAction)
{
// 定義所要綁定的事件類型
EventTrigger.Entry entry = new EventTrigger.Entry();
// 設(shè)置事件類型
entry.eventID = eventTriggerType;
// 初始化回調(diào)函數(shù)
entry.callback = new EventTrigger.TriggerEvent();
// 定義回調(diào)函數(shù)
UnityEngine.Events.UnityAction<BaseEventData> callBack = new UnityEngine.Events.UnityAction<BaseEventData>(unityAction);
// 綁定回調(diào)函數(shù)
entry.callback.AddListener(callBack);
eventTrigger.triggers.Add(entry);
}
調(diào)用測(cè)試:
private EventTrigger eventTrigger;
private void Start()
{
eventTrigger = GetComponent<EventTrigger>();
EventTest();
}
private void EventTest()
{
AddEventTriggerFun(EventTriggerType.PointerClick, (BaseEventData baseEventData) => { ClickEvent(); });
}
private void ClickEvent()
{
Debug.Log("點(diǎn)擊事件綁定成功...");
}
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
C# .NET及Mono跨平臺(tái)實(shí)現(xiàn)原理解析
這篇文章主要介紹了C# .NET及Mono、跨平臺(tái)實(shí)現(xiàn)原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
C#實(shí)現(xiàn)操作windows系統(tǒng)服務(wù)(service)的方法
這篇文章主要介紹了C#實(shí)現(xiàn)操作windows系統(tǒng)服務(wù)(service)的方法,可實(shí)現(xiàn)系統(tǒng)服務(wù)的啟動(dòng)和停止功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
C#中#define后面只加一個(gè)參數(shù)的解釋
今天小編就為大家分享一篇關(guān)于C#中#define后面只加一個(gè)參數(shù)的解釋,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-04-04
字符串陣列String[]轉(zhuǎn)換為整型陣列Int[]的實(shí)例
下面小編就為大家分享一篇字符串陣列String[]轉(zhuǎn)換為整型陣列Int[]的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
C#使用DES和AES實(shí)現(xiàn)加密解密功能示例
這篇文章主要介紹了C#使用DES和AES實(shí)現(xiàn)加密解密功能,結(jié)合具體實(shí)例形式分析了C#實(shí)現(xiàn)DES與AES的加密解密功能實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-06-06
C#實(shí)現(xiàn)在控制臺(tái)輸出當(dāng)前系統(tǒng)時(shí)間的方法
這篇文章主要介紹了C#實(shí)現(xiàn)在控制臺(tái)輸出當(dāng)前系統(tǒng)時(shí)間的方法,涉及C#時(shí)間函數(shù)DateTime.Now的使用方法,需要的朋友可以參考下2015-04-04

