はじめに
イベントについて話をしていた際、イベントハンドラ・Sender・Receiver・購読などの用語が出てきて、あれそれってどこの部分のことだっけ?となってしまったことがありました。
まだsenderやsubscribeといった用語は単語の意味からなんとなく分かるかもしれませんが、イベントハンドラとかは結構ピンと来ないような気がします。
ということで今回は簡単なイベントを使ったスクリプトを見ながら、用語の紹介をしたいと思います。
ただ用語にも流派があるらしい?ので、一応参考程度に考えてくれたら幸いです。
サンプル
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という訳ですね。
またマイクロソフトのドキュメントではこのように表現されていました。
イベントを送信する ( 発生させる) クラスを パブリッシャー 、イベントを受信する ( 処理する) クラスを サブスクライバーと呼びます。
イベントとイベントハンドラ
よくお世話になっている”未確認飛行”さんにはこのように書かれていました。
「キーボードのボタンが押された」とか「マウスが移動した」等の、 コンピュータ上で発生するなんらかの事象のことをイベント(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
はほぼ使うこともないので、どういう命名規則をすればいいのか正直よく分かっていません。。。
さいごに
とりあえず色々な単語の説明をしてみました。
ただここまで書いておきながらかなり今回の記事は自信がないです。
もし間違っていましたら、教えていただけると嬉しいです!