【Unity】Action・Eventとは? 使用例を踏まえてわかりやすく解説

【Unity】Action・Eventとは? 使用例を踏まえてわかりやすく解説

 Unityでイベントの処理を作成する上でactionとeventを知っておくとイベントを監視するのに凄く便利なので、今回はわかりやすく記事にまとめていきます。またデリゲートという完成した関数に処理を追加したり他の関数を追加できる方法も使用しているのでぜひ使ってみてくださいね。

イベントとは? スクリプトでの実装と違う点

 C#のスクリプトに、ある変数の値が変化するとオブジェクトを移動させる処理を書いたとします。

 これをゲームのイベントとしてスクリプトに書き込むだけでも良いのですが、ここでEventを使うともっと簡単にイベントを監視することができます。

Eventの定義

//ライバルが仲間に加入するイベント
public event Action<bool> get_friend;
//ライバルが仲間に加入したことを監視するイベント
public event Action surveillance;

 例として定義します。

Actionとは?

 このActionというメゾットには、イベントを開始するかどうかの条件として型を指定することができます。

 ライバルが仲間に加入したらtrueを記憶し、監視するイベントでtrueかどうかで判断し、デバックに出力します。

使用例

イベントを起こすスクリプト

 このスクリプトを空のオブジェクトに追加します。

 キーボードのAを押すと加入イベント成功、Dを押すと加入イベント失敗、Wを押すとライバルと出会います。

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

public class YOU : MonoBehaviour
{
    //ライバルが仲間に加入するイベント
    public event Action<bool> get_friend;
    //ライバルが仲間に加入したことを監視するイベント
    public event Action surveillance;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A)) {
            Debug.Log("仲間に加入した");
            //加入イベント成功
            get_friend?.Invoke(true);
        }else if (Input.GetKeyDown(KeyCode.D)) {
            Debug.Log("ライバルは寂しそうに去っていった");
            //加入イベント失敗
            get_friend?.Invoke(false); 
        }else if (Input.GetKeyDown(KeyCode.W)) {
            Debug.Log("ライバルに出会った");
            surveillance?.Invoke();
        }
    }
}

  get_friend?.Invoke(true);はget_friendイベントにbool型の引数を渡しています。

イベントを監視するスクリプト

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

public class Surveillance : MonoBehaviour
{

    //イベントを起こす側のスクリプトをインスペクターから設定
    [SerializeField] YOU you;

    //加入イベントの成否を受け取る用
    bool get_flag;

    void Start()
    {
        // ライバルと出会った時のイベント
        you.surveillance += () => { Debug.Log("ライバル「よう、久しぶりだな」"); };

        // flag に bool の結果を受け取る。
        you.get_friend += getflag => {

            if (getFlag) { Debug.Log("ライバル「これからよろしく」"); }
            else { Debug.Log("ライバル「そうか。またな」"); }

        };
    }
}

 ここでも見慣れない書き方が出てきました。

you.surveillance += () => {Debug.Log("ライバル「よう、久しぶりだな」");};

 この{}内にスクリプトを追加することができます。

 書き方としては、関数+= () => {追加したい関数やコード};ですね。

 これをデリゲートといい、他にも関数を追加することができます。

public void test(){};
public void A(){Debug.Log("Aの処理完了")};

//関数にコードを追加したい時
test += () =>{Debug.Log("追加の処理完了")};

//test()にA()を追加したい時
test += A();

//test()をA()にしたい時
test = A();

まとめ

 Eventと使うと監視が容易になる!

 デリゲートも活用すれば、イベントを監視しつつイベント内容を追加していけそうですね。