MRが楽しい

MRやVRについて学習したことを書き残す

スクリプトからUnityEventに引数有りのリスナーを登録する

本日は UnityEvent の小ネタ枠です。
スクリプトからUnityEventに引数有りのリスナーを登録する方法を記事にします。

前提条件

前回記事の続きです。
今回はスクリプトからの登録となるため、非永続的リスナーでの登録方法となります。
bluebirdofoz.hatenablog.com

引数有りの登録方法

以下のように AddListener に関数を登録することで、動的に引数を指定することができます。

UnityEventInstance.AddListener(() => CallMethod(args));

サンプルスクリプト

文字列リストを基に、引数を指定したリスナーを登録して実行する以下のスクリプトを作成しました。
・CheckUnityEventArgs.cs

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

public class CheckUnityEventArgs : MonoBehaviour
{
    /// <summary>
    /// テスト用UnityEvent
    /// </summary>
    public UnityEvent TestEvent;

    /// <summary>
    /// テスト用引数リスト
    /// </summary>
    public List<string> MessageList;

    /// <summary>
    /// リスナーの登録とイベントの実行
    /// </summary>
    public void AddListenerAndInvoke()
    {
        Debug.Log("AddListenerAndInvoke");

        // リスナーを一旦全て破棄する
        TestEvent.RemoveAllListeners();

        // リストのメッセージを個々に引数に渡すリスナーを登録する
        foreach(string message in MessageList)
        {
            TestEvent.AddListener(() => TestCallMethod(message));
        }

        // 登録リスナーを呼び出す
        TestEvent.Invoke();
    }

    /// <summary>
    /// 試験用呼び出しメソッド
    /// </summary>
    public void TestCallMethod(string message)
    {
        Debug.Log("TestCallMethod Called !!! : " + message);
    }
}

適当なゲームオブジェクトに設定し、引数で渡す文字列リストを作成しておきます。
f:id:bluebirdofoz:20210721233138j:plain

動作確認

シーンを再生して動作を確認します。
f:id:bluebirdofoz:20210721233149j:plain

関数を実行すると、引数にリストの文字列を指定されたイベントが実行されます。
f:id:bluebirdofoz:20210721233200j:plain