今回はUnityのスクリプトで使う「UnityAction」の基本についてのメモです。
はじめに
Unityのバージョンは2021.3.14f1です。(あまりバージョンは関係ないですが・・・)
UnityActionとは下記の公式リファレンスにあるように、簡単に言うと「UnityEvent で使用される引数なしのデリゲート」です。
デリゲートを直訳すると委託するとか、委任するとかそんな感じですね。どういうことなのかは置いといて、実際に作成して見ていきます。
UnityActionのサンプルを作成
公式リファレンスを参考にサンプルを作成して動作を見ていきます。
UIの作成
まずは「2DObject」→「Sprites」→「Square」を追加。名前を「UnityActionSample」にしておきます。

次に「UI」→「Legacy」→「Button」を追加します。

下記のように真ん中に四角が表示され、ボタンがあればOK。

スクリプトの作成
次に、リファレンスを参考にスクリプトを作成。
using UnityEngine; using UnityEngine.UI; using UnityEngine.Events; public class UnityActionSample : MonoBehaviour { [SerializeField] private Renderer _rend; private UnityAction ActionFunc; private float number; void Start() { ActionFunc += FirstFunction; ActionFunc += SecondFunction; } void FirstFunction() { number++; Debug.Log("Number : " + number); } void SecondFunction() { _rend.material.color = new Color(Random.value, Random.value, Random.value, 1.0f); ; Debug.Log("Color Set"); } public void BtnClick() { ActionFunc?.Invoke(); } }
簡単に説明すると、Start内で「ActionFunc」にメソッド(関数)の「FirstFunction」と「SecondFuction」を登録。BtnClickで「ActionFunc」を呼び出しています。ActionFunc?.Invoke()の「?」は、空の場合のエラーを回避しています。
パラメータのセット、実行
作成したスクリプトを「UnityActionSample」にアタッチして、パラメータをセット。

ボタンクリック時に、作成したスクリプトの「BtnClick」を呼び出すようにします。

これで実行。ボタンをクリックすると色が変わり、Numberが増えていきます。「FirstFunction」と「SecondFuction」の2つが実行されているのが分かりますね。

補足(実例)
サンプルの場合、UnityActionを使わずボタンクリックで「FirstFunction」と「SecondFuction」を呼び出せばいいじゃんとなります。
実際には、例えば、下記のようにゲーム終了時に呼び出すのを作成。
public static GameManager Instance { get; private set; } public UnityAction gameEnd;
終了時の処理として、プレイヤーを消す、敵キャラの動きを止める、スコアの表示など多くありますが下記のように各スクリプトで終了処理を作成することで、依存関係を解消することが出来ます。
// PlayerScript.cs GameManager.Instance.gameEnd += PlayerDestroy;
// EnemyScript.cs GameManager.Instance.gameEnd += EnemyStop;
他にも色々な使い方があるけど、基本を押さえておけば他人が作成したスクリプトを見て何をしているのか大体分かりますよね。