ディレクト イベント バインディング の経験があれば、クリエイティブの仕掛けで使い慣れた イベント や各関数の概念を Verse にも容易に当てはめることができるでしょう。Verse を使用すれば、イベントの発生時に実行する独自の関数と動作をコード化することができます。
以下のセクションでは、Verse を使ってクリエイティブの仕掛けのイベントで作業するさまざまな方法や、独自のロジックをコード化する方法について説明します。
クリエイティブの仕掛けのイベントに関数をバインドする
クリエイティブの仕掛けによって公開されるイベントには、クリエイティブの仕掛けの API を使ってサブスクライブできます。たとえば、ボタン の仕掛けのクラス button_device
は InteractedWithEvent
を公開しますが、これはプレイヤーがそのボタンの仕掛けとインタラクトするたびに発生します。このイベントで Subscribe()
を呼び出して、イベントが通知されるたびに呼び出す関数の識別子を渡すことが可能です。
サブスクライブ すると、イベントが通知されたときに呼び出す関数を指定できるようになります。これは、イベントへの バインディング と呼ばれます。バインドされた関数は ハンドラ と呼ばれます。下の例では OnButtonInteractedWith
がハンドラです。
イベント 定義に従って、関数シグネチャ はイベントがコールを期待する内容に一致する必要があります。たとえば、button_device
のイベント InteractedWithEvent
にサブスクライブすると、agent
型のパラメータを 1 つ含む関数が与えられることが想定されるため、OnButtonInteractedWith
関数は次のようになります。
using { /Fortnite.com/Devices}
using { /Verse.org/Simulation}
hello_world_device := class(creative_device):
@editable
MyButtonDevice:button_device = button_device{}
OnBegin<override>()<suspends>:void=
# OnButtonInteractedWith 関数をボタンの仕掛けの InteractedWithEvent にバインドします
MyButtonDevice.InteractedWithEvent.Subscribe(OnButtonInteractedWith)
OnButtonInteractedWith(InAgent:agent):void=
Print("Player interacted with button!")
仕掛けのイベントで Subscribe()
を呼び出すと、この関数は cancelable
結果を返します。Cancel()
を cancelable
変数で呼び出すと、イベントを処理する関数のサブスクライブが解除されます。その結果、この関数はイベントが通知されたときに呼び出されなくなります。
cancelable
の単一の結果を格納する場合、option
などのコンテナを使用します。直接 cancelable
変数を作成できませんが、option
変数を設定してサブスクリプションの結果を保持できます。
using { /Fortnite.com/Devices}
using { /Verse.org/Simulation}
spawner_button := class(creative_device):
@editable
Button:button_device = button_device{}
# イベント サブスクリプションを格納するためのコンテナです
var ButtonSubscription:?cancelable = false
OnBegin<override>()<suspends>:void=
ButtonSubscription := Button.InteractedWithEvent.Subscribe(OnButtonInteractedWith)
# cancelable の結果を option 変数の値として設定します。
set ButtonSubscription = option{Subscription}
Print("Subscribed to the Button's InteractedWithEvent and assigned the subscription to ButtonSubscription!")
OnButtonInteractedWith(InPlayer:agent):void=
Print("Player interacted with button!")
# InteractedWithEvent サブスクリプションの cancelable 変数にアクセスします
if(CancelableResult := ButtonSubscription?):
CancelableResult.Cancel()
Print("Canceled this InteractedWithEvent")
Verse の仕掛けに複数のイベント サブスクリプションが含まれる場合は、後にそれらをキャンセルできるように、配列 などのコンテナを使って各イベント サブスクリプションからのすべての cancelable
結果を格納することをお勧めします。Subscribe()
は cancelable
結果を返すため、初めてイベントにサブスクライブするときに cancelable
配列の値を設定できます。
プレイヤーがサンプルのボタンを押したときにアイテムをスポーンする
このセクションでは、プレイヤーが ボタン とインタラクトした際にアイテムをスポーンする アイテム スポナー の作成について説明します。
- アイテム スポナー の仕掛けと ボタン の仕掛けをレベルに配置して、開始します。レベルに仕掛けを配置する方法については、「クリエイティブ ユーザー向けの UEFN コントロール」を参照してください。
- このアイテム スポナーの仕掛けでスポーンするアイテムを設定します。詳細については、「アイテム スポナーの仕掛け」を参照してください。
- ボタンの仕掛けとアイテム スポナーの仕掛け用の編集可能なプロパティを含む Verse の仕掛けを作成します。「Verse の参照をレベル内のクリエイティブの仕掛けに追加する」を参照してください。
cancelable
オプション変数を仕掛けに追加して、ボタンの仕掛けのサブスクリプションを追跡します。InteractedWithEvent
にサブスクライブして、その結果をoption
にキャストし、ButtonSubscription
変数に割り当てます。InteractedWithEvent
のイベント ハンドラで、ItemSpawner.SpawnItem()
を呼び出します。その後、ButtonSubscription
オプション内の値にアクセスし、Cancel()
を呼び出して、サブスクリプションをキャンセルします。- 次は、プレイヤーがボタンの仕掛けとインタラクトした際にアイテムをスポーンするための完全な Verse コードです。 ボタンの仕掛けとのインタラクションが 2 回目の場合、アイテムはスポーンされません。
using { /Fortnite.com/Devices} using { /Verse.org/Simulation} spawner_button := class(creative_device): @editable Button:button_device = button_device{} @editable ItemSpawner:item_spawner_device = item_spawner_device{} # イベント サブスクリプションを格納するためのコンテナです var ButtonSubscription:?cancelable = false OnBegin<override>()<suspends>:void= Subscription := Button.InteractedWithEvent.Subscribe(OnButtonInteractedWith) # cancelable の結果を Subscriptions 配列内の場所に追加します。 set ButtonSubscription = option{Subscription} Print("Subscribed to the Button's InteractedWithEvent and assigned the subscription to ButtonSubscription!") OnButtonInteractedWith(InPlayer:agent):void= ItemSpawner.SpawnItem() # InteractedWithEvent サブスクリプションの cancelable 変数にアクセスします if(CancelableResult := ButtonSubscription?): CancelableResult.Cancel() Print("Canceled this InteractedWithEvent")
ゲームを開始し、ボタンをインタラクトするとアイテムがスポーンされます。
InteractedWithEvent
をキャンセルしたので、ボタンからはアイテムが一度だけスポーンされます。
この仕掛けのサブスクリプションとキャンセルを使用するゲーム サンプルについては、「タグ付きライト パズル」チュートリアルを参照してください。
クリエイティブの仕掛けのイベントを待機する
イベントにサブスクライブすることもできますが、イベントの発生を待機するための別の方法もあります。クリエイティブの仕掛けで Await()
を呼び出します。これは 非同期 の関数呼び出しであり、完了に時間がかかることがあります。つまり、並列処理式や suspends
指定子を含む関数などの非同期コンテキスト内で使用する必要があることを意味しています。並列処理の詳細については、「並列処理の概要」を参照してください。
次の例では、Verse の仕掛けはプレイヤーが トリガー の仕掛けとインタラクトするのを待ち、その間は何もしません。また、プレイヤーがトリガーの仕掛けの前にいずれかのボタンの仕掛けとインタラクトしても、何も起こりません。プレイヤーは、トリガーの仕掛けとのインタラクション後に、2 つのボタンのいずれを選択するか決める必要があります。プレイヤーがインタラクトできるのはいずれかのボタン 1 つだけであり、結果として何らかが発生するのも最初の一度限りです。これは、このコードでは race
式を使って 2 つのボタン イベント間でレースを行うためです。この並列処理式の仕組みの詳細については、「race」を参照してください。
using { /Fortnite.com/Devices}
using { /Verse.org/Simulation}
make_a_choice_device:= class(creative_device):
@editable
MakeChoice:trigger_device = trigger_device{}
@editable
RedButton:button_device = button_device{}
@editable
BlueButton:button_device = button_device{}
OnBegin<override>()<suspends>:void=
# プレイヤーがトリガーを踏むのを待っており、それが発生するまで他のコードがここで実行されることを防ぎます。
# これは、プレイヤーが 2 つのボタンの仕掛けとインタラクトした場合も、このイベントが発生するまでは何も起こらないことを意味します。
MakeChoice.TriggeredEvent.Await()
Print("Make a choice: red button and stay in wonderland, or blue button and wake up back in your bed.")
# この race 式では、両方のブロック式が同時に実行されます。
# プレイヤーがいずれかのボタンとインタラクトすると、他のボタンとのインタラクションの待機がキャンセルされます。
# プレイヤーがインタラクトできるのは、ボタンの仕掛けのいずれか 1 つだけであることを表しています。
race:
block:
RedButton.InteractedWithEvent.Await()
Print("You chose to stay in wonderland.")
block:
BlueButton.InteractedWithEvent.Await()
Print("You chose to wake up in your bed.")
# ここではイベントが一度だけ発生するのを待っていただけなので、この時点でプレイヤーが他の仕掛けとインタラクトしても、何も発生しません。
これらのイベントが待機するのは一度だけです。これらのイベントの待機を繰り返す場合は、loop
式を使ってこのロジックを何度でも繰り返すことができます。
次のステップ:仕掛けモジュール
アイテム スポナーとボタンで作業する方法を解説しましたが、独自の仕掛けから使用し、サブスクライブできる、多くのクリエイティブの仕掛けがあります。この情報については、「Verse API リファレンス」を参照してください。Verse で作業できる、あらゆるクリエイティブの仕掛けについては、「仕掛けモジュール」を参照してください。