🦔

[UEFN][verse] UEFNのカスタムイベント実装を考える[2] 「イベントリスナ」と「イベントハンドラ」についておさらい

2023/07/20に公開

前回はこちら
https://zenn.dev/t_tutiya/articles/c5203d67739a4a

今回はコードはお休みして、イベント処理の構成要素である「イベントハンドラ」と「イベントリスナ」について説明します。

※用語の解説は土屋の我流であり、verseの言語仕様に即した物というわけでもないのでご了承下さい。

イベントとは何か

先にここで言う「イベント」が何を意味する用語なのかを確認しておきます。

イベント駆動プログラミング(event-driven programming)」というプログラミングスタイルがあります。簡単に言うと、アプリの実行中に、なにかしらのキッカケ(例えば「ボタンが押された」)が発生した時に、そのキッカケに対応する処理(例えば「SEを鳴らす」)を実行する、という流れを繰り返して処理を進めていく形式の事を言います。

「ボタンが押された」などのキッカケの事を「イベント(event)」と言います。イベントの発生に応じて処理が実行されるから「イベント駆動」なわけです。

一般的に、イベントの処理は「イベントリスナ」と「イベントハンドラ」から構成されています。

イベントハンドラ(Event handler)

イベントが発生した時に実行する処理(通常はなんらかのメソッド)の事を「イベントハンドラ(Event handler)」と呼びます。

「ハンドラ(handler)」は「ハンドル(handle. 「把手」)」から来ていて、実行する処理のエントリポイントである事を示しています[1][2]

イベントリスナ(Event listener)

イベントの発生を監視する処理(通常はなんらかのオブジェクト)の事を「イベントリスナ(Event listener)」と呼びます。

通常、イベントごとにイベントリスナが用意されていて、ユーザは対応するイベントリスナにイベントハンドラを登録します。一つのイベントリスナに複数のイベントハンドラを登録することも出来ます。この登録する作業を「サブスクライブ(subscribe. 定期購読)する」と呼ぶ事もあります。

イベントリスナは対応するイベントの発生を待ち、発生したら登録されていたイベントハンドラ(=メソッド)を実行します。

「リスナ(listener)」は「ラジオリスナー」の「リスナー(listener. 聞き手)」の事です。イベントの発生を機聞き耳を立てて待っている、くらいの意味なのかなと思います(よくは知らない)。

ボタン押下イベントの例

例を見てみましょう。verseのボタンデバイスで、ボタンが押された時に特定の処理を実行したい場合、以下の様なコードを書きます(MyButtonがボタンデバイスです)。

MyButton.InteractedWithEvent.Subscribe(HandleButtonInteraction)

ここではInteractedWithEventがイベントリスナ、HandleButtonInteractionがイベントハンドラに対応します。イベントリスナのSubscribeメソッドを介して、イベントハンドラを関連づけているわけです。

もう少しだけ詳しく書いておくと、InteractedWithEventプロパティはイベントリスナであるEventオブジェクト[3]を返します。EventSubscribe()メソッドを介してイベントハンドラを保持します。

イベントリスナは設定されたイベント(ここではボタンの押下)を監視し、イベントが発生したら、保持していた全てのイベントハンドラ、つまりクラスメソッドを実行します。

このような一連の流れによって「ボタンを押された時、対応する処理を実行する」というイベント駆動の処理フローが機能するわけです。

次回

前回は組み込みのイベント処理を実装し、今回はイベント駆動の構造について確認しました。 ここまでは、イベントリスナーは組み込みの物(listenableインターフェイスオブジェクト)を使っていました。

次回はEventクラスを使って、イベントリスナをスクラッチ実装してみたいと思います(そんなに奇麗なコードにはならない予定です)。

続き

https://zenn.dev/t_tutiya/articles/adf6cf84eaded0


verse言語とUEFNの記事を他にも書いているので御覧下さい。
https://zenn.dev/t_tutiya

最後まで読んで頂きありがとうございました。この記事がお役に立てたようであれば、是非LIKEとフォローをお願いします(今後の執筆のモチベーションに繋がります)。

#Verse #UEFN #Fortnite #Verselang #UnrealEngine

脚注
  1. 多分。語義を書いてるサイトを見つけられなかった ↩︎

  2. Win32API時代は「コンテキストハンドル」と呼んでいた記憶。「リスナ」に合わせて「ハンドラ」と呼ばれるようになったのでは? 知らんけど ↩︎

  3. 実際にはlistenableインターフェイスオブジェクト ↩︎

Discussion