Unity 實現給物體動態添加事件
介紹一個方法給物體動態的添加事件(點擊 拖拽等)
using System.Events; using System.EventSystems; //_go is the gameobject which need add event //_go 是物體,因為EventTrigger是unity中的一個組件,我們要用添加組件的方式來給物體添加事件觸發組件 //_type is the EventTriggerType(point , drag , clickdown...... //_type 是要添加的事件觸發類型,這是一個內置枚舉 //_action is the funtion //_action 這裡之前寫的時候可能是沒有註意就寫上瞭funtion瞭,其實這應該是一個委托一個UnityAction類型的委托 void AddTriggerEvent (GameObject _go , EventTriggrtType _type , UnityAction<BaseEventData> _action) { // 查看是否已經有這個組件 EventTrigger trigger = _go.GetComponent<EventTrigger>(); // 如果沒有就添加組件 if (trigger == null) { trigger = _go.AddComponent<EventTrigger>(); } //2021年2月20日更新 //沒有必要加這句話,因為你使用的隻是一個引用,並不是屬性 //if (trigger.triggers.Count==0) //{ // trigger.triggers = new List<EventTrigger.Entry>(); //} //新建觸發實例 EventTrigger.Entry entry = new EventTrigger.Entry(); // 之前我在項目裡寫的時候是直接添加的方法,沒有用傳值的方式,所以這裡寫的有些累贅 //UnityAction<BaseEventData> callBack = new UnityAction<BaseEventData>(_action); // 修改之前累贅寫法 //entry.callback.AddListener(callBack); entry.callback.AddListener(_action); //設置實例類型 entry.eventID = _type; // 將實例添加到觸發列表中 trigger.triggers.Add(entry); }
2021年2月20日更新
看到自己之前寫的博客太過簡略,也沒有註意事項,重新編輯一下,我現在重新加上瞭註釋,對腳本進行瞭部分修改,然後下面講一下註意事項
1.這個事件觸發是使用的unity內置的事件觸發系統,所以在使用的時候一定要有
這兩個組件,就是你在場景裡新建UI組件的時候自己新建的那個東西
2.如果是UI的話,可以直接添加,但如果不是UI的話,確保兩件事
1) 確保相機上有射線組件
這兩個組件分別對應3D物體和2D物體
2)要被檢測的組件一定要有collder組件
隻有這樣才能保證eventtrigger的正確實現
補充:Unity 動態給物體添加EventTrigger事件
給掛載該腳本的物體自動添加 EventTrigger 組件:
[RequireComponent(typeof(EventTrigger))] public class ModelComponent : MonoBehaviour { }
給物體動態添加 EventTrigger 的觸發事件:
private void AddEventTriggerFun(EventTriggerType eventTriggerType, UnityEngine.Events.UnityAction<BaseEventData> unityAction) { // 定義所要綁定的事件類型 EventTrigger.Entry entry = new EventTrigger.Entry(); // 設置事件類型 entry.eventID = eventTriggerType; // 初始化回調函數 entry.callback = new EventTrigger.TriggerEvent(); // 定義回調函數 UnityEngine.Events.UnityAction<BaseEventData> callBack = new UnityEngine.Events.UnityAction<BaseEventData>(unityAction); // 綁定回調函數 entry.callback.AddListener(callBack); eventTrigger.triggers.Add(entry); }
調用測試:
private EventTrigger eventTrigger; private void Start() { eventTrigger = GetComponent<EventTrigger>(); EventTest(); } private void EventTest() { AddEventTriggerFun(EventTriggerType.PointerClick, (BaseEventData baseEventData) => { ClickEvent(); }); } private void ClickEvent() { Debug.Log("點擊事件綁定成功..."); }
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- None Found