Unity 介紹 UnityEvent
分類
說明
相信大部分的開發者在開發 Unity 的時候,都曾使用過按鈕的 OnClick
事件,在 Unity 編輯器中可以直接新增或刪除點擊時會觸發的方法,是一個相當便利的開發方法,本篇將分享如何使用和自訂 UnityEvent。
UnityEvent
在 c# 中也有 event 關鍵字,而 UnityEvent 是針對 Unity 進一步改良的 c# event,好處是可以在編輯器上手動新增刪除觸發的方法,在學 c# event 之前,你可能要先了解 delegate 關鍵字,關於 c# event, delegate 我將附在最後參考連結,本篇我們先將重點放在 UnityEvent 使用方式。
Event Listener 事件監聽
事件監聽意思是當事件觸發時,會調用哪些方法。這裡的事件跟我們平常歷史看到的XXX事件不同,這裡的事件比較像未來會發生的事件,例如:按鈕點擊事件,當按鈕點擊時會執行所有監聽按鈕點擊的方法。
就好像下列的範例程式碼,但不是真的這樣寫。
public void Click()
{
DoSomething();
DoSomething1();
DoSomething2();
}
使用方式
下列為 Unity 官方文件的範例
using UnityEngine;
using UnityEngine.Events;
using System.Collections;
public class ExampleClass : MonoBehaviour
{
UnityEvent m_MyEvent;
void Start()
{
if (m_MyEvent == null)
m_MyEvent = new UnityEvent();
m_MyEvent.AddListener(Ping);
}
void Update()
{
if (Input.anyKeyDown && m_MyEvent != null)
{
m_MyEvent.Invoke();
}
}
void Ping()
{
Debug.Log("Ping");
}
}
首先宣告 m_MyEvent
事件,在 Start()
新增監聽 Ping
方法,在 Update()
中使用 if 判斷式,等待玩家按下任何鍵觸發 m_MyEvent
事件。當觸發 m_MyEvent
事件後,也就是執行 m_MyEvent.Invoke()
方法,就會調用 Ping()
方法。
自訂 Unity 事件
這是另一個 Unity 官方文件範例。
using UnityEngine;
using UnityEngine.Events;
[System.Serializable]
public class MyIntEvent : UnityEvent<int>
{
}
public class ExampleClass : MonoBehaviour
{
public MyIntEvent m_MyEvent;
void Start()
{
if (m_MyEvent == null)
m_MyEvent = new MyIntEvent();
m_MyEvent.AddListener(Ping);
}
void Update()
{
if (Input.anyKeyDown && m_MyEvent != null)
{
m_MyEvent.Invoke(5);
}
}
void Ping(int i)
{
Debug.Log("Ping" + i);
}
}
你可以看到 MyIntEvent
繼承自 UnityEvent<int>
後面還有一個 <int>
,也就是這個事件會傳遞一個 int 引數,所以監聽的事件方法必須有一個 int 參數,Ping(int i)
就有一個 int 的參數。
我是一個檔案只能有一個 class 的理論派,在大部分的情況下,這可以降低專案的複雜度,但我不知道上述那樣適不適合這個理論,可以的話盡量遵守會比較好。
[System.Serializable]
是為了讓 MyIntEvent
可以被 Unity Editor 看見。
你也可以直接宣告 public UnityEvent<int> m_MyEvent;
,就不用自訂事件了,是否要自訂事件就看當時開發情境而定,可以看得出來自訂的事件可以增加可讀性(如果有良好的命名話),而直接使用 UnityEvent<int>
會比較方便。
參考
相關文章:
一杯咖啡的力量,勝過千言萬語的感謝。
支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!