之所以要實現代碼添加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 >類參數,所以觸發函數的參數不可少