代碼添加EventTrigger監聽事件

之所以要實現代碼添加EventTrigger監聽事件只是爲了以後修改的時候方便些,畢竟手動拖拽添加後期有變更的話修改起來會比較麻煩

一個slider一個button另外加一個空對象Eventmanager用來掛AddEvent腳本

代碼:

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;

public class AddEvent : MonoBehaviour {
    Transform Canvas_Root;
    GameObject Btn_continue, Slider_sound;

    void Awake()
    {
        Canvas_Root = GameObject.Find("Canvas").transform;
        Btn_continue = Canvas_Root.Find("BtnContinue").gameObject;
        Slider_sound = Canvas_Root.Find("SliderSound").gameObject;
        AddTriggersListener(Btn_continue, EventTriggerType.PointerClick, BtnContinue);
        AddTriggersListener(Slider_sound, EventTriggerType.Drag, SliderDrag);
        AddTriggersListener(Slider_sound, EventTriggerType.EndDrag, SliderEndDrag);
    }
    void BtnContinue(BaseEventData eventData)
    {
        Debug.Log("button  clicked");
    }
    void SliderDrag(BaseEventData eventData)
    {
        Debug.Log("drag  slider");
    }
    void SliderEndDrag(BaseEventData eventData)
    {
        Debug.Log("end drag slider");
    }
    /// <summary>
    /// 爲obj添加Eventrigger監聽事件
    /// </summary>
    /// <param name="obj">添加監聽的對象</param>
    /// <param name="eventID">添加的監聽類型</param>
    /// <param name="action">觸發的函數</param>
    private void AddTriggersListener(GameObject obj, EventTriggerType eventType, UnityAction<BaseEventData> action)
    {
        //首先判斷對象是否已經有EventTrigger組件,若沒有那麼需要添加
        EventTrigger trigger = obj.GetComponent<EventTrigger>();
        if (trigger == null)
        {
            trigger = obj.AddComponent<EventTrigger>();
        }
        //實例化delegates
        if (trigger.triggers.Count == 0)
        {
            trigger.triggers = new List<EventTrigger.Entry>();//  
        }
        //定義所要綁定的事件類型 
        EventTrigger.Entry entry = new EventTrigger.Entry();
        //設置事件類型  
        entry.eventID = eventType;
        //定義回調函數  
        UnityAction<BaseEventData> callback = new UnityAction<BaseEventData>(action);
        //設置回調函數  
        entry.callback.AddListener(callback);
        //添加事件觸發記錄到GameObject的事件觸發組件  
        trigger.triggers.Add(entry);
    }

}
結果:


PS1:

  爲對象添加EventTrigger監聽事件後,運行時,在inspector視圖中只會顯示已經爲對象添加了監聽事件,但具體監聽事件的函數並不顯示。如下圖


PS2:

EventTrigger的AddListener參數是 UnityAction< BaseEventData>泛型委託,其註冊的事件方法需要支持 UnityAction< BaseEventData >類參數,所以觸發函數的參數不可少






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章