プレイヤーが着地すると消えるプラットフォームは、障害物コースのようなプラットフォーミング ゲームモードの中心となります。このようなプラットフォームでは、プレイヤーは落下しないようにすばやく動作してどこに移動するのかを考える必要があります。
このチュートリアルでは、Unreal Editor for Fortnite (UEFN) で Verse を使用して、プレイヤーが接触すると消え、乱数秒後に再び現れるプラットフォームを構築する方法を学習します。この例では、プレイヤーが落下しないようにプラットフォーム間をジャンプしなければならないエリアを作成する方法を示します。完全なスクリプト は、参照用としてこのガイドの末尾に記載されています。
使用する Verse 言語機能
使用する Verse API
-
Sleep()
:Sleep()
API は、プラットフォームが消えてから乱数秒後に再び現れるまでの遅延を挿入するために使用されます。 -
GetRandomFloat()
:GetRandomFloat()
API は、プラットフォームが再び現れるまでの乱秒数を計算するために使用されます。 -
編集可能なプロパティ:UEFN には 4 つのプロパティが公開されており、プラットフォームが消えてから再び現れるまでの遅延とプラットフォーム参照自体を 3 つの浮動小数点値で制御します。
-
仕掛けイベント:トリガー仕掛けの
TriggeredEvent
を使用して、プレイヤーがプラットフォームに着地したタイミングを把握します。
レベルを設定する
このチュートリアルでは、Verse スターター テンプレート を開始点として使用します。開始するには、Verse の仕掛け 機能の例から新しいプロジェクトを初期化します。
この例では、次の小道具と仕掛けを使用しています。
-
1 x プレイヤー スポーン パッド仕掛け:この仕掛けにより、ゲームの開始時にプレイヤーがスポーンする場所を定義します。
-
4 x クリエイティブ小道具;クリエイティブ小道具には、プラットフォームの可視性とコリジョンを切り替える
Hide()
やShow()
など、Verse で呼び出すことができる動作がいくつかあります。このチュートリアルでは、プレイヤーが操作可能なプラットフォームとして Airborne Hoverplatform A を使用しますが、自分の体験のニーズに合わせて自由に変更可能です。 -
4 x トリガーの仕掛け:これらのトリガーを使用して、プレイヤーが各プラットフォームに着地したタイミングを把握します。
次の手順に従ってレベルを設定します。
-
シーンに Airborne Hoverplatform A を 1 つ追加します。プレイヤーが消えるプラットフォームから時間内に飛び降りなければ落下するよう、フロアの上にその仕掛けを設置します。アウトライナー で、プラットフォームに「RecyclePlatform」という名前を付けます。
-
シーンにトリガー仕掛けを 1 つ追加し、それを RecyclePlatform の子として設定します。プラットフォームの上に配置し、プラットフォーム全体に収まるようにサイズを変更します。アウトライナー で、[Visible In Game (ゲーム中に表示)] を「False」に設定し、[Times Can Trigger (起動可能回数)] を「1」に設定します。
-
プラットフォーム上にプレイヤー スポーン パッドの仕掛けを設置します。これは、ゲーム開始時にプレイヤーがスポーンする場所です。プレイヤーがスポーンした後にスポーン パッドに立てなくなるように、アウトライナー で [Visible in Game (ゲーム中に表示)] オプションを無効にします。完全なセットアップは次のようになります。
仕掛けを作成する
この例では、Verse で作成した仕掛け を使用し、プラットフォームがプレイヤーの着地時に消えて乱数秒後に再び現れるようにするための動作を定義します。Verse を使用してこのような仕掛けを作成するには、次の手順に従います。
-
Verse Explorer を使用して、「disappear_on_touch_platform」という名前の新しい Verse の仕掛けを作成します。Verse で新しい仕掛けを作成する方法については、「Verse を使用して独自の仕掛けを作成する」を参照してください。
-
仕掛け disappear_on_touch_platform を コンテンツ ブラウザ からレベルにドラッグします。
UEFN で仕掛けのプロパティを編集する
このセクションでは、4 つの仕掛けのプロパティをエディタでカスタマイズできるように UEFN に公開する方法を示します。
-
レベルに配置したクリエイティブ オブジェクトへの仕掛けの参照。
-
プレイヤーがプラットフォームに触れてから非表示になるまでの待機時間を格納する、「
DisappearDelay
」という浮動
定数。 -
プラットフォームを再表示させるまでの最短時間と最長時間を格納する、
DelayMin
とDelayMax
という名前の 2 つの浮動
定数。これら 2 つの値により、乱数を取得するときの許容範囲を定義します。
前のセクションで作成した仕掛け disappear_on_touch_platform からこれらのプロパティを公開するには、次の手順に従います。
-
Verse Explorer を開き、「disappear_on_touch_platform.verse」をダブルクリックして、Visual Studio Code でスクリプトを開きます。
-
disappear_on_touch_platform
クラス定義に次のフィールドを追加します。-
「
DisappearDelay
」という名前の編集可能な浮動
小数値。これは、プレイヤーがプラットフォームに接触してからそのプラットフォームを非表示にするまでの時間です。この 値 を「1.0
」、つまり 1 秒に 初期化 します。# プレイヤーがプラットフォームに接触してからそのプラットフォームを非表示にするまでの時間。 @editable DisappearDelay:float = 1.0
-
「
DelayMin
」という名前の編集可能な浮動
小数値。これは、プラットフォームを再表示させるまでの最短時間を表します。これを3.0
、つまり 3 秒に初期化します。# これは、プラットフォームを再表示させるまでの最短時間を表します。 @editable DelayMin:float = 3.0
-
「
DelayMax
」という名前の編集可能な浮動
小数値。これは、プラットフォームを再表示させるまでの最大時間を表します。これを4.0
、つまり 4 秒に初期化します。# これは、プラットフォームを再表示させるまでの最大時間を表します。 @editable DelayMax:float = 4.0
-
「
DisappearingPlatform
」という編集可能なcreative_prop
。これは、周期的に消えて現れるレベル内プラットフォームを表します。コードにはまだレベル内のこのオブジェクトへの参照がないため、空の アーキタイプcreative_prop{}
を使用してこれをインスタンス化します。この参照は後で浮動プラットフォームに割り当てます。# レベル内のプラットフォームへの参照。 @editable DisappearingPlatform:creative_prop = creative_prop{}
-
「
PlatformTrigger
」という名前の編集可能なtrigger_device
。プレイヤーがプラットフォームに着地したタイミングを知るには、この仕掛けからのTriggeredEvent
イベントが必要になります。# プレイヤーがプラットフォームに着地したときに入るゾーン。 @editable PlatformTrigger:trigger_device = trigger_device{}
-
-
disappear_on_touch_platform
クラスのフィールドは次のようになります。# レベルに配置できる、Verse で作成したクリエイティブの仕掛け disappear_on_touch_platform := class(creative_device): # プレイヤーがプラットフォームに接触してからそのプラットフォームを非表示にするまでの時間。 @editable DisappearDelay:float = 1.0 # これは、プラットフォームを再表示させるまでの最短時間を表します。 @editable DelayMin:float = 3.0 # これは、プラットフォームを再表示させるまでの最大時間を表します。 @editable DelayMax:float = 4.0 # レベル内のプラットフォームへの参照。 @editable DisappearingPlatform:creative_prop = creative_prop{} # プレイヤーがプラットフォームに着地したときに入るゾーン。 @editable PlatformTrigger:trigger_device = trigger_device{}
@editable
属性を使用すると、スクリプトからエディタにToggleDelay
などの値を公開するのに役立ちます。これにより、毎回 Verse コードを再構築することなく UEFN で値をカスタマイズできるため、すばやくイテレートしてゲームプレイ体験に適した値を見つけることができます。 -
Visual Studio Code にスクリプトを保存します。
-
UEFN ツールバーで、[Verse] をクリックして [Build Verse Code (Verse コードをビルド)] をクリックし、レベルの disappear_on_touch_platform 仕掛けを更新します。
-
UEFN の [Outliner] パネルで仕掛け disappear_on_touch_platform を選択し、[Details] パネルを開きます。
-
[Disappear on Touch Platform] の [Details] パネルで、オブジェクト ピッカー をクリックしてビューポートのカラー チェンジ タイルの仕掛けを選択し、プラットフォーム を RecyclePlatform (レベルに追加したクリエイティブ小道具) に設定します。
-
これで、Verse の仕掛けよって参照される小道具ができたので、両方の仕掛けを選択し、レベル内で複数回複製して、プレイヤーがジャンプできる一連のプラットフォームを作成します。作成する新しい Verse の仕掛けはそれぞれ独自のプラットフォームを参照します。
プラットフォームを非表示にする/表示する
レベルと仕掛けを設定したら、プレイヤーがプラットフォームに着地したときにプラットフォームを表示する/非表示にする機能を追加できます。この動作を disappear_on_touch_platform
クラスに追加するには、次の手順に従います。
-
creative_prop
クラスには、可視性を切り替えるHide()
とShow()
という 2 つの メソッド があります。Visual Studio Code に戻り、OnBegin()
でHide()
を呼び出し、次にDisappearingPlatform
でShow()
を呼び出します。# 実行中のゲームで仕掛けが開始されたときに実行します OnBegin<override>()<suspends>:void= # プラットフォームを非表示にします。 DisappearingPlatform.Hide() # プラットフォームを表示します。 DisappearingPlatform.Show()
このコードを実行すると、
Hide()
とShow()
の呼び出しが直後に発生するため、プラットフォームが消えて再表示されることはありません。 -
プラットフォームをより長く表示/非表示状態に維持するには、
Sleep()
を使用してHide()
またはShow()
を呼び出すときの遅延を追加できます。Sleep()
関数によってルーチンの実行が一時停止されるため、この関数にfloat
引数 を渡して実行を一時停止する時間 (秒) を指定します。各Hide()
およびShow()
呼び出しの前に、先ほど定義したDisappearDelay
を渡してSleep()
を呼び出します。# 実行中のゲームで仕掛けが開始されたときに実行します OnBegin<override>()<suspends>:void= # DisappearDelay 秒待ちます。 Sleep(DisappearDelay) # プラットフォームを非表示にします。 DisappearingPlatform.Hide() # DisappearDelay 秒待ちます。 Sleep(DisappearDelay) # プラットフォームを表示します。 DisappearingPlatform.Show()
これで、このコードを実行した場合、プラットフォームは 1 秒 (
DisappearDelay
で定義した時間) 非表示になった後、ゲームが終わるまで表示されるようになりました。Sleep()
関数は、asynchronous コンテキストでのみ呼び出し可能です。OnBegin()
メソッドはsuspends
指定子を持っているため、すでに非同期コンテキストであるため、これ以上何もする必要はありません。suspends
指定子の詳細については、「指定子と属性」を参照してください。 -
プラットフォームが再び現れるまでの時間を変えるとゲームがより面白くなります。
Sleep()
に毎回同じ値を指定するのではなく、関数GetRandomFloat()
で乱秒数を取得し、その値をSleep()
に渡すことができます。-
ファイルの先頭に「
using { /Verse.org/Random}
」を追加し、GetRandomFloat()
関数を使用できるようにします。using { /Fortnite.com/Devices} using { /Verse.org/Random} using { /Verse.org/Simulation} using { /UnrealEngine.com/Temporary/Diagnostics} # Verse の仕掛けの作成方法については、https://dev.epicgames.com/documentation/ja-jp/uefn/create-your-own-device-in-verse を参照してください。 # レベルに配置できる、Verse で作成したクリエイティブの仕掛け disappear_on_touch_platform := class(creative_device):
-
プラットフォームを再表示させるまでの時間を決定するときに
Sleep()
の引数としてGetRandomFloat()
関数を使用し、DelayMin
とDelayMax
で秒数の許容範囲を設定します。# 実行中のゲームで仕掛けが開始されたときに実行します OnBegin<override>()<suspends>:void= # DisappearDelay 秒待ちます。 Sleep(DisappearDelay) # プラットフォームを非表示にします。 DisappearingPlatform.Hide() # DelayMin 秒から DelayMax 秒の間待機します。 Sleep(GetRandomFloat(DelayMin, DelayMax)) # プラットフォームを表示します。 DisappearingPlatform.Show()
これで、プラットフォームは消える前に
1.0
秒待機し、その後3.0
秒から4.0
秒の間に再び表示されるようになりました。 -
プレイヤーがプラットフォームに着地したことを検出する
プレイヤーがプラットフォームに着地したタイミングを検出できるようにするには、trigger_device
クラスが公開する TriggeredEvent
イベント を サブスクライブ します。トリガーは、プレイヤーがその上を歩いたときにのみ TriggeredEvent
を送信します。Times Can Trigger を 1 に設定しているため、トリガーに対して Reset()
を呼び出して状態をリセットし、TriggeredEvent
を再度送信できるようにする必要があります。
プレイヤーがプラットフォームに接触したタイミングを検出し、それに応じて前のセクションで作成したコードでプラットフォームを非表示にする/再表示させるには、次の手順に従います。
-
TriggeredEvent
には、オプション のplayer
と戻り値の型としてのvoid
を含む関数シグネチャが必要です。コードを介してトリガー仕掛けをアクティブ化することもできます。したがって、この関数ではエージェントはオプションで、アクティブ化したのがプレイヤーであるかどうかを確認する必要があります。OnPlayerTouch()
と呼ばれるdisappear_on_touch_platform
クラスに新しいメソッドを追加します。OnPlayerTouch(ActivatingPlayer:?agent):void=
-
OnPlayerTouch()
のif
式で、ActivatingPlayer
オプションからプレイヤーを取得してみます。この呼び出しが成功した場合、コードではなくプレイヤーがトリガーをアクティブにしたことがわかります。OnPlayerTouch(ActivatingPlayer:?agent):void= if: Player := ActivatingPlayer? then: Print("プレイヤーがプラットフォームに触れました!")
-
OnBegin()
で、イベントハンドラとしてOnPlayerTouch
を使用してPlatformTrigger.TriggeredEvent
をサブスクライブします。これで、プレイヤーがプラットフォームに着地するたびに、TriggeredEvent
がアクティブになり、OnPlayerTouch()
が実行されるようになります。OnBegin<override>()<suspends>:void= # プレイヤーがプラットフォームに着地したタイミングを検出するには、 # プラットフォームのトリガー TriggeredEvent をサブスクライブします。 PlatformTrigger.TriggeredEvent.Subscribe(OnPlayerTouch)
-
プラットフォームが非表示になっている場合、プレイヤーはプラットフォームを通過するため、トリガーをアクティブにすることはできません。これを処理するには、
OnBegin()
で、Hide()
とShow()
の後にそれぞれPlatformTrigger.Disable()
とEnable()
の呼び出しを追加します。これで、プラットフォームが非表示になっている間はトリガーを操作できなくなります。OnBegin<override>()<suspends>:void= # プレイヤーがプラットフォームに着地したタイミングを検出するには、 # プラットフォームのトリガー TriggeredEvent をサブスクライブします。 PlatformTrigger.TriggeredEvent.Subscribe(OnPlayerTouch) # DisappearDelay 秒待ちます。 Sleep(DisappearDelay) # プラットフォームを非表示にしてトリガーを無効にします。 DisappearingPlatform.Hide() PlatformTrigger.Disable() # DelayMin 秒から DelayMax 秒の間待機します。 Sleep(GetRandomFloat(DelayMin, DelayMax)) # プラットフォームを表示し、トリガーを有効にします。 DisappearingPlatform.Show() PlatformTrigger.Enable()
プレイヤーがプラットフォームに着地したときにプラットフォームを非表示にする必要がある一方で、プラットフォームを非表示および表示するためのコードを OnPlayerTouch()
メソッドに直接追加することはできません。Sleep()
関数は非同期コンテキストでのみ呼び出すことができます。また、TriggeredEvent
ではイベントハンドラとして非同期関数を使用できないため、OnPlayerTouch()
に suspends
指定子を追加することはできません。その代わりに、spawn
を使用して OnPlayerTouch()
から非同期を呼び出すことが可能です。非同期関数を追加するには、次の手順に従います。
-
disappear_on_touch_platform
クラス定義に新しいメソッドRecyclePlatform()
を追加します。さらに<suspends>
モディファイアを追加し、このコードを非同期で実行できるようにします。そして、プラットフォームとトリガーを非表示および表示するためのコードをOnBegin
からRecyclePlatform()
コード ブロックに移動します。# プラットフォームを非表示にして、PlatformTrigger をリセットします。その後、ランダムな時間待機し、プラットフォームの表示を再度アクティブ化します。 RecyclePlatform()<suspends> : void = # DisappearDelay 秒待ちます。 Sleep(DisappearDelay) # プラットフォームを非表示にしてトリガーを無効にします。 DisappearingPlatform.Hide() PlatformTrigger.Disable() # DelayMin 秒から DelayMax 秒の間待機します。 Sleep(GetRandomFloat(DelayMin, DelayMax)) # プラットフォームを表示し、トリガーを有効にします。 DisappearingPlatform.Show() PlatformTrigger.Enable()
-
OnPlayerTouch()
では、RecyclePlatform()
のspawn{}
を呼び出してコードを非同期的に実行します。完成したRecyclePlatform()
関数は次のようになります。# プレイヤーがプラットフォームに着地すると実行されます。RecyclePlatform() を呼び出して、プラットフォーム # を非表示にしてトリガー状態をリセットします。 OnPlayerTouch(ActivatingPlayer:?agent):void= if: Player := ActivatingPlayer? then: Print("プレイヤーがプラットフォームに触れました!") spawn{RecyclePlatform()}
このコードを実行した場合、プレイヤーが初めてプラットフォームに着地したときにプラットフォームが消え、その後再び現れるようになります。
非同期 の場合、コードの一部が完了するまでにある程度の時間がかかる可能性があります。このようなケースでは、たとえばプラットフォームをリサイクルしようとすると、すべての
Sleep()
が呼び出されるため数秒かかります。async 関数では、async 関数を呼び出すコードの実行をブロックすることなく演算を実行できます。 非同期コンテキストとspawn
式の詳細については、「並列処理」を参照してください。 -
現在のところ、プレイヤーが初めてプラットフォームに着地したときにしか
TriggeredEvent
はディスパッチされません。イベントを再度トリガー可能にするには、トリガーのリセットを呼び出します。RecyclePlatform()
では、Enable()
を呼び出した後、PlatformTrigger
でReset()
を呼び出します。# プラットフォームを非表示にして、PlatformTrigger をリセットします。その後、ランダムな時間待機し、プラットフォームの表示を再度アクティブ化します。 RecyclePlatform()<suspends> : void = # DisappearDelay 秒待ちます。 Sleep(DisappearDelay) # プラットフォームを非表示にしてトリガーを無効にします。 DisappearingPlatform.Hide() PlatformTrigger.Disable() # DelayMin 秒から DelayMax 秒の間待機します。 Sleep(GetRandomFloat(DelayMin, DelayMax)) # プラットフォームを表示し、トリガーを有効にします。 DisappearingPlatform.Show() PlatformTrigger.Enable() # PlatformTrigger がトリガーできる回数をリセットします。 PlatformTrigger.Reset()
-
スクリプトを保存し、[Verse] をクリックして [Build Verse Code (Verse コードをビルド)] をクリックし、コードをコンパイルします。
-
UEFN ツールバーの [Launch Session (セッションを起動)] をクリックし、レベルをプレイテストします。
-
今、レベルをプレイテストすると、各プラットフォームは着地すると消え、乱数秒後に再び現れるはずです。
完全なスクリプト
次のコードは、プレイヤーがプラットフォームに着地したときにそのプラットフォームを非表示にし、乱数秒後に再表示させるための完全なスクリプトです。
using { /Fortnite.com/Devices}
using { /Verse.org/Random}
using { /Verse.org/Simulation}
using { /UnrealEngine.com/Temporary/Diagnostics}
# Verse の仕掛けの作成方法については、https://dev.epicgames.com/documentation/ja-jp/uefn/create-your-own-device-in-verse を参照してください。
# レベルに配置できる、Verse で作成したクリエイティブの仕掛け
disappear_on_touch_platform := class(creative_device):
# プレイヤーがプラットフォームに接触してからそのプラットフォームを非表示にするまでの時間。
@editable
DisappearDelay:float = 1.0
# これは、プラットフォームを再表示させるまでの最短時間を表します。
@editable
DelayMin:float = 3.0
# これは、プラットフォームを再表示させるまでの最大時間を表します。
@editable
DelayMax:float = 4.0
# レベル内のプラットフォームへの参照。
@editable
DisappearingPlatform:creative_prop = creative_prop{}
# プレイヤーがプラットフォームに着地したときに入るゾーン。
@editable
PlatformTrigger:trigger_device = trigger_device{}
# 実行中のゲームで仕掛けが開始されたときに実行します
OnBegin<override>()<suspends>:void=
# プレイヤーがプラットフォームに着地したタイミングを検出するには、
# プラットフォームのトリガー TriggeredEvent をサブスクライブします。
PlatformTrigger.TriggeredEvent.Subscribe(OnPlayerTouch)
# プレイヤーがプラットフォームに着地すると実行されます。RecyclePlatform() を呼び出して、プラットフォーム
# を非表示にしてトリガー状態をリセットします。
OnPlayerTouch(ActivatingPlayer:?agent):void=
if:
Player := ActivatingPlayer?
then:
Print("プレイヤーがプラットフォームに触れました!")
spawn{RecyclePlatform()}
# プラットフォームを非表示にして、PlatformTrigger をリセットします。その後、ランダムな時間待機し、プラットフォームの表示を再度アクティブ化します。
RecyclePlatform()<suspends> : void =
# DisappearDelay 秒待ちます。
Sleep(DisappearDelay)
# プラットフォームを非表示にしてトリガーを無効にします。
DisappearingPlatform.Hide()
PlatformTrigger.Disable()
# DelayMin 秒から DelayMax 秒の間待機します。
Sleep(GetRandomFloat(DelayMin, DelayMax))
# プラットフォームを表示し、トリガーを有効にします。
DisappearingPlatform.Show()
PlatformTrigger.Enable()
# PlatformTrigger がトリガーできる回数をリセットします。
PlatformTrigger.Reset()
応用編
このチュートリアルでは、Verse を使用して、プレイヤーが着地したときにプラットフォームを非表示にし、乱数秒後に再表示させる仕掛けの作成方法を学習しました。
ここで学習したことを活かして以下を試してみてください。
-
プラットフォームのサイズや位置を変更して面白い課題を作る。
-
この例では、プレイヤーがポイントを獲得することはなく、落下しても何も起きません。スコアリング システムと失点条件を組み込む方法について考えてみてください。