Unity 介紹 UnityEvent


建立時間: 2023年8月31日 01:17
更新時間: 2023年11月30日 00:46

說明

相信大部分的開發者在開發 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> 會比較方便。

參考

觀看次數: 1308
eventunity
按讚追蹤 Enjoy 軟體 Facebook 粉絲專頁
每週分享資訊技術

一杯咖啡的力量,勝過千言萬語的感謝。

支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!