はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】Event関連の一体どいつがイベントハンドラー、Sender、Receiverなのか

はじめに

イベントについて話をしていた際、イベントハンドラSenderReceiver購読などの用語が出てきて、あれそれってどこの部分のことだっけ?となってしまったことがありました。

まだsendersubscribeといった用語は単語の意味からなんとなく分かるかもしれませんが、イベントハンドラとかは結構ピンと来ないような気がします。

ということで今回は簡単なイベントを使ったスクリプトを見ながら、用語の紹介をしたいと思います。

ただ用語にも流派があるらしい?ので、一応参考程度に考えてくれたら幸いです。

サンプル

Sender.cs
using UnityEngine;

/// <summary>
/// eventを発行する側(イベントの送信元)
/// </summary>
public class Sender : MonoBehaviour
{
    /// <summary>
    /// イベントハンドラ
    /// </summary>
    public delegate void SomeEventHandler();

    /// <summary>
    /// イベント
    /// </summary>
    public static event SomeEventHandler OnSomeChanged;

    protected virtual void Execute()
    {
        //イベント発行
        if (OnSomeChanged != null)
            OnSomeChanged();
    }
}
Receiver.cs
using UnityEngine;

/// <summary>
/// eventを受ける側
/// </summary>
public class Receiver : MonoBehaviour
{
    private void Start()
    {
        //イベントの購読(subscribe)
        Sender.OnSomeChanged += SomeMethod;

        //イベントの購読を解除(unsubscribe)
        Sender.OnSomeChanged -= SomeMethod;
    }

    private void SomeMethod()
    {
        Debug.Log("SomeMethod");
    }
}

SenderとReceiver

Senderイベントを発行するクラスのこと、
Receiverイベントを受けるクラスのことを表します。

実際にデリゲートを定義している方がSenderで、メソッドを登録しているほうがReceiverという訳ですね。

またマイクロソフトのドキュメントではこのように表現されていました。

イベントを送信する ( 発生させる) クラスを パブリッシャー 、イベントを受信する ( 処理する) クラスを サブスクライバーと呼びます。

イベント - C# プログラミング ガイド | Microsoft Docs

イベントとイベントハンドラ

よくお世話になっている”未確認飛行”さんにはこのように書かれていました。

「キーボードのボタンが押された」とか「マウスが移動した」等の、 コンピュータ上で発生するなんらかの事象のことをイベント(event)といい、 イベントが発生したときに行う処理のことをイベント ハンドラー(event handler)と呼びます。

イベント - C# によるプログラミング入門 | ++C++; // 未確認飛行 C


Senderクラスを見てみると、delegateを定義しているところがイベントハンドラということになるようです。

またActionデリゲートを使った場合は

public static event Action OnSomeChanged;

もイベントハンドラということができるでしょう。

subscribeとunsubscribe

メソッドをデリゲート経由で渡して登録すること購読(subscribe)
渡したメソッドの登録を解除すること購読を解除(unsubscribe)というみたいです。

また、マイクロソフトのドキュメントにはこのように表現されていました。

”サブスクライブ”  ”サブスクリプションの解除”

イベントのサブスクリプションとサブスクリプション解除を行う方法 - C# プログラミング ガイド | Microsoft Docs

subscribeしているところが+=unsubscribeしているところが-=というわけですね。

よく分からないところ

イベントの勉強をするとOnを先頭につけるべきと書かれているものがよくあります。

どうやら登録されているデリゲートを呼び出すメソッドを定義するときはOnを付けるべきみたいです。

またマイクロソフトのドキュメントにはこのように書かれています。

イベントを発生させるには、protectedand virtualとしてマークされているメソッドを追加します。このメソッドにOn+EventNameという名前を付けます。

Handling and Raising Events | Microsoft Docs

Google翻訳なので少し日本語が変かもしれませんが、.NETではこの条件を満たしたものにしかOnをつけていないっぽいです。

class Counter
{
    public event EventHandler ThresholdReached;

    protected virtual void OnThresholdReached(EventArgs e)
    {
        EventHandler handler = ThresholdReached;
        handler?.Invoke(this, e);
    }

    // provide remaining implementation for the class
}

ただ色んなサイトを見ていると、デリゲート型の変数名にOnをつけているものもよく見かけます。
またUnityではEventHandlerはほぼ使うこともないので、どういう命名規則をすればいいのか正直よく分かっていません。。。

さいごに

とりあえず色々な単語の説明をしてみました。
ただここまで書いておきながらかなり今回の記事は自信がないです。

もし間違っていましたら、教えていただけると嬉しいです!