一連の消えるプラットフォームは、障害物コースのようなプラットフォーミング ゲーム モードの中心です。このようなプラットフォームでは、プレイヤーはリズムを取ってプラットフォーム間をジャンプする必要があり、そうしなければ落下して最初からやり直さなければなりません。
このチュートリアルでは、Unreal Editor for Fortnite (UEFN) において、Verse で作成した 1 つの仕掛けで順番に現れて消える一連のプラットフォームを作成する方法を学習します。
使用する Verse 言語機能
array
:array
型 により、すばやくアクセスするとともにコードの重複を防ぐためにプラットフォームの参照をまとめて格納できます。loop
:プラットフォームの出現と消失のサイクルは、ゲームの開始時に始まり、ゲームが終了するまで続く必要があります。この例では、Verse のloop
式 を使用してこのような動作を作成する方法を示します。block
:block
式により、順番に 実行 されるように複数の式をグループ化できます。for
:for
式により、一連のプラットフォームに影響を与えられるよう、それらのプラットフォームに対する操作を繰り返すことができます。sync
:sync
式と 構造化並列処理 により、複数の式を同時に実行できます。
使用する Verse API
Sleep()
:Sleep()
API により、プラットフォームを非表示および表示状態にする時間を選択できます。- 編集可能なプロパティ:Verse で作成した仕掛け の 7 つのプロパティが UEFN に公開されており、エディタでカスタマイズできます。3 つはプラットフォームの動作の遅延、4 つはプラットフォームの仕掛けの参照です。
手順
次の手順に従って、周期的に消えて現れる一連のプラットフォームを設定する方法を学習します。完全なスクリプト は、参照用としてこのガイドの末尾に記載されています。
レベルを設定する
この例では、次の小道具と仕掛けを使用しています。
- プレイヤー スポーン パッドの仕掛け × 1: この仕掛けにより、ゲームの開始時にプレイヤーがスポーンする場所を定義します。
- カラー チェンジ タイルの仕掛け x 7: 現在のところ、カラー チェンジ タイルの仕掛けは、仕掛けの可視性を切り替える
Hide()
やShow()
などの動作が含まれているため、プレイヤーがインタラクト可能なプラットフォームを作成するのに最適なオプションです。 - フロア タイル × 2: プレイヤーの開始タイルと終了タイル、およびプレイヤーが越えなければならない割れ目を作成するためのものです。
レベルを設定するには、次の手順に従います。
- プレイヤーが消えるプラットフォームから時間内に飛び降りなければ落下するよう、フロアの上にカラー チェンジ タイルの仕掛けを設置します。[Outliner (アウトライナー)] パネルで仕掛けに Platform1 という名前を付けます。
-
[Outliner] パネルで Platform1 を選択し、[Details (詳細)] パネルを開きます。
-
[Advanced (詳細設定)] の [Details] パネルで、[Collision During Games (ゲーム中の当たり判定)] を [Only When Visible (表示時のみ)] に設定します。
-
レベル内のカラー チェンジ タイルの仕掛けを複製してさらに 6 つのプラットフォームを作成し、それらのプラットフォームを順番に設置します。仕掛けに Platform2、Platform3、Platform4、Platform5、Platform6、Platform7 という名前を付けます。
-
プレイヤーがリズムを取ってジャンプしなければならないように、各カラー チェンジ タイルの仕掛けの両側に 2 つのフロア タイルを設置します。プレイヤーが辛うじて反対側に着地できるくらいの配置にする必要があります。
-
最初に現れるプラットフォームに最も近いフロア タイルに プレイヤー スポーン パッド の仕掛けを設置します。
設定したレベルは次のようになります。
仕掛けを作成する
この例では、Verse で作成した仕掛け を使用し、プラットフォームの可視性を切り替えるための動作を定義します。Verse を使用してこのような仕掛けを作成するには、次の手順に従います。
-
platform_series という名前の新しい Verse の仕掛けを作成します。Verse で新しい仕掛けを作成する方法については、「Verse を使用して独自の仕掛けを作成する」を参照してください。
-
UEFN ツールバーで、[Verse] をクリックして [Build Verse Code (Verse コードをビルド)] をクリックし、作成したコードを コンパイル します。
-
仕掛けの スクリプト が問題なくコンパイルされると、プロジェクトの 「Content」 フォルダの 「CreativeDevices」 フォルダに Verse で作成した仕掛けが表示されます。
-
仕掛け platform_series を コンテンツ ブラウザ からレベルにドラッグします。
UEFN で仕掛けのプロパティを編集する
このセクションでは、7 つの仕掛けのプロパティをエディタでカスタマイズできるように UEFN に公開する方法を示します。
- プラットフォームを非表示にする/表示する時間を格納する、
HeadStart
、AppearDelay
、DisappearDelay
という名前の 3 つの浮動定数。 - レベルに設置した 4 つのカラー チェンジ タイルの仕掛けに対する 4 つの仕掛けの参照。
設計の変更を繰り返すときに UEFN ですばやく値をカスタマイズしてコースのレイアウトに合ったタイミングを見つけられるよう、スクリプトから AppearDelay
のような定数を公開しておくと便利です。
前のセクションで作成した仕掛け platform_series からこれらのプロパティを公開するには、次の手順に従います。
- Verse Explorer を開き、platform_series.verse をダブルクリックして Visual Studio Code でスクリプトを開きます。
- ファイルの一番上に
using { /Verse.org/Simulation }
を追加して編集可能なプロパティを有効にします。using { /Fortnite.com/Devices } using { /Verse.org/Native } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/Diagnostics } log_platform_series := class(log_channel){} platform_series := class<concrete>(creative_device): Logger : log = log{Channel := log_platform_series}
platform_series
クラスの定義に次のフィールドを追加します。- 編集可能なフィールド
HeadStart
は、プラットフォームが現れ始めてから消え始めるまでの秒数を表します。2.45 秒になるように値2.45
で定数を初期化します。@editable HeadStart : float = 2.45
- 編集可能なフィールド
AppearDelay
は、次のプラットフォームが現れるまでの秒数を表します。0.98 秒になるように値0.98
で定数を初期化します。@editable AppearDelay : float = 0.98
- 編集可能なフィールド
DisappearDelay
は、次のプラットフォームが消えるまでの秒数を表します。1.11 秒になるように値1.11
で定数を初期化します。@editable DisappearDelay : float = 1.11
* 定期的に現れたり消えたりするプラットフォームを表すためのフィールド
Platform
。color_changing_tiles_device{}
で初期化します。@editable Platform : color_changing_tiles_device = color_changing_tiles_device{}
- 編集可能なフィールド
platform_series
クラスのフィールドは次のようになります。platform_series := class<concrete>(creative_device): Logger : log = log{Channel := log_platform_series} @editable HeadStart : float = 2.45 # プラットフォームが現れ始めてから、プラットフォームが消え始めるまでの待ち時間を秒単位で示します。 @editable AppearDelay : float = 0.98 # 次のプラットフォームが現れるまでの待ち時間を秒単位で示します。 @editable DisappearDelay : float = 1.11 # 次のプラットフォームが消えるまでの待ち時間を秒単位で示します。 @editable Platform : color_changing_tiles_device = color_changing_tiles_device{}
- Visual Studio Code にスクリプトを保存します。
-
UEFN ツールバーで、[Verse] をクリックして [Build Verse Code (Verse コードをビルド)]をクリックし、レベルの仕掛け platform_series を更新します。
- UEFN の [Outliner] パネルで仕掛け platform_series を選択し、[Details] パネルを開きます。
-
[Platform Series] の [Details] パネルで、オブジェクト ピッカー をクリックしてビューポートのカラー チェンジ タイルの仕掛けを選択し、レベルに追加したカラー チェンジ タイルの仕掛けに プラットフォーム を設定します。
プラットフォームを非表示にする/表示する
レベルと最初のプラットフォームを設定したら、プラットフォームを表示する/非表示にする機能を追加します。仕掛け platform_series にこのような動作を追加するには、次の手順に従います。
color_changing_tiles_device
クラスには、可視性を切り替える 2 つの メソッド (Show()
とHide()
) があります。スクリプト ファイル内のOnBegin
メソッドでそれらのPlatform
のメソッドを呼び出します。OnBegin<override>()<suspends> : void = Platform.Hide() # プラットフォームが非表示になります Platform.Show() # プラットフォームが表示されます
このコードを実行した場合、
Hide()
とShow()
がそれぞれの直後に呼び出されるため、プラットフォームが消えて再び現れる状態にはなりません。- プラットフォームをより長く表示/非表示状態にするには、
Sleep()
を使用してHide()
とShow()
が呼び出される間の遅延を追加します。Sleep()
関数によってルーチンの実行が一時停止されるため、この関数にfloat
引数を渡して実行を一時停止する時間 (秒) を指定します。OnBegin<override>()<suspends> : void = Platform.Hide() # プラットフォームが非表示になります Sleep(DisappearDelay) # 次の式に進む前に Sleep(DisappearDelay) は DisappearDelay 秒待機します Platform.Show() # プラットフォームが表示されます
このコードを実行した場合、
Platform
は 1.11 秒 (DisappearDelay
で定義した時間) 非表示になった後、ゲームが終わるまで表示されます。
複数のプラットフォームを非表示にする/表示する
- 前の手順のコードは、非表示にするレベルのすべてのプラットフォームに対して繰り返すことができました。もう 1 つの方法としては、すべての仕掛けの参照を格納する配列を作成します。この方法の場合、プラットフォームに影響を及ぼしたいときに、各プラットフォームのコードを複製するのではなく、作成した配列で操作を繰り返すだけで済みます。
platform_series
クラス定義においてPlatform : color_changing_tiles_device
フィールドを配列Platforms : []color_changing_tiles_device
に変更します。この配列を使用して順番にプラットフォームに対する操作を繰り返します。デフォルト値array{}
(空の配列) で変数を初期化します。
@editable Platforms : []color_changing_tiles_device = array{}
- UEFN の [Outliner] パネルで仕掛け platform_series を選択し、[Details] パネルを開きます。
- [Platform Series] の [Details] パネルで、レベルに追加したカラー チェンジ タイルの仕掛けに プラットフォーム を設定します。[Add Element] ボタンで新しい要素を配列に追加し、オブジェクト ピッカー をクリックし、ビューポートでカラー チェンジ タイルの仕掛けを選択します。次のようにプラットフォームを操作する順序を一致させます。
- Platform1
- Platform2
- Platform3
- Platform4
- Platform5
- Platform6
- Platform7
for
式を使用して配列の要素に対する操作を繰り返すことができます。for
式は、X -> Y
パターンを使用してインデックスと値のペアを示します。インデックスは左部分 (X
) に、値は右部分 (Y
) に結合されます。このケースでは、X
はプラットフォームの番号/インデックス、Y
は配列から取得した各プラットフォームの参照になっています。OnBegin<override>()<suspends> : void = for (PlatformNumber -> Platform : Platforms): Logger.Print("Platform{PlatformNumber} is now hidden.") Platform.Hide() Sleep(DisappearDelay) for (PlatformNumber -> Platform : Platforms): Logger.Print("Platform{PlatformNumber} is now shown.") Platform.Show() Sleep(AppearDelay)
HideAllPlatforms()
とShowAllPlatforms()
という名前の 2 つの新しいメソッドを作成し、それぞれに前の手順のfor
式のいずれか (1 つはすべてのプラットフォームを非表示にする式、もう 1 つはすべてのプラットフォームを表示する式) を追加します。Sleep()
関数を使用しているため、メソッドには<suspends>
のエフェクトが必要です。OnBegin<override>()<suspends> : void = HideAllPlatforms() ShowAllPlatforms() HideAllPlatforms()<suspends> : void = for (PlatformNumber -> Platform : Platforms): Logger.Print("Platform{PlatformNumber} is now hidden.") Platform.Hide() Sleep(DisappearDelay) ShowAllPlatforms()<suspends> : void = for (PlatformNumber -> Platform : Platforms): Logger.Print("Platform{PlatformNumber} is now shown.") Platform.Show() Sleep(AppearDelay)
このコードを実行した場合、プラットフォームはすべて順番どおりに消えてから同じ順番で再び現れます。 1. ゲームの実行中にプラットフォームが消えて再び現れる動作が続くようにするには、
loop
式を使用してこれらの呼び出しを繰り返します。この例では、ゲームの実行中にプラットフォームの可視性を切り替え続け、ゲームが終わるまでその動作を継続させるため、break
式を追加してloop
を終了する必要はありません。OnBegin<override>()<suspends> : void = loop: HideAllPlatforms() ShowAllPlatforms()
このコードを実行した場合、プラットフォームはすべて順番どおりに消えてから同じ順番で再び現れ、ゲームが終わるまでその動作が繰り返されます。
消えて再び現れるプラットフォームを同期させる
プレイヤーがタイル間をジャンプするときにさらに緊迫感を持たせるには、後続のプラットフォームがまだ現れつつある状態のときにプラットフォームが消え始めるようにします。そうなると、プレイヤーは急いでタイル間を移動しなければならなくなり、急がなければ落下することになります。このような動作を作成するには、プラットフォームが消える前にプレイヤーがスタートを切って次のプラットフォームに飛び乗れるよう、両方のルーチン (ShowAllPlatforms()
と HideAllPlatforms()
) を同時に実行し、後者が前者に後れを取るようにしなければなりません。
プラットフォームをすべて同時に非表示にする/表示するには、次の手順に従います。
HideAllPlatforms()
とShowAllPlatforms()
を並列で (同時に) 実行するには、sync
式を使用します。sync
式は、コード ブロックで 2 つ以上の async 式を同時に実行し、その式のすべてが完了するまで待ってから次に進みます。OnBegin<override>()<suspends> : void = loop: sync: HideAllPlatforms() ShowAllPlatforms()
このコードを実行した場合、プラットフォームの非表示と表示が同時に行われるようになります。プレイヤーにジャンプする時間が与えられるよう、1 つ目のプラットフォーム (とそれに続くすべてのプラットフォーム) がしばらく表示されてから非表示になるようにする必要があるため、これは望ましい結果ではありません。
- プレイヤーが先にスタートを切れるようにプラットフォームが消え始めるタイミングを遅らせるには、
Sleep()
を使用します。sync
は、コード ブロックで式のすべてを同時に実行するため、Sleep()
とHideAllPlatforms()
が順番に実行されてプラットフォームが消え始めるタイミングに遅れが生じるよう、block
式を使用する必要があります。OnBegin<override>()<suspends> : void = loop: sync: ShowAllPlatforms() block: Sleep(HeadStart) HideAllPlatforms()
- スクリプトを保存し、[Verse] をクリックして [Build Verse Code (Verse コードをビルド)] をクリックし、コードをコンパイルします。
-
UEFN ツールバーの [Launch Session (セッションを起動)] をクリックし、レベルをプレイテストします。
ここでレベルをプレイテストすると、後続のプラットフォームが再び現れつつある中でプラットフォームが順番に消え始め、ゲームの実行中はこのパターンが繰り返し続けられます。
完全なスクリプト
次のコードは、順番に現れて消える一連のプラットフォームを作成するための完全なスクリプトです。
using { /Fortnite.com/Devices }
using { /Verse.org/Native }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
log_platform_series := class(log_channel){}
platform_series := class<concrete>(creative_device):
Logger : log = log{Channel := log_platform_series}
@editable
HeadStart : float = 2.45 # プラットフォームが現れ始めてから、プラットフォームが消え始めるまでの待ち時間を秒単位で示します。
@editable
AppearDelay : float = 0.98 # 次のプラットフォームが現れるまでの待ち時間を秒単位で示します。
@editable
DisappearDelay : float = 1.11 # 次のプラットフォームが消えるまでの待ち時間を秒単位で示します。
@editable
Platforms : []color_changing_tiles_device = array{} # プラットフォームが順番に現れる/消えるようにします。
OnBegin<override>()<suspends> : void =
<#
Verse の構造化並列処理により、並列演算とそれらの演算の実行方法を非常に説明しやすくなります。
このケースでは、次の 2 つのコルーチンがあります。
- 1 つ目のコルーチンはすぐに開始され、配列に格納された順番でプラットフォームを表示させます
- もう 1 つのコルーチンは、配列に格納された順番でそのプラットフォームが非表示にされるまで待ってから開始されます
#>
loop:
sync:
ShowAllPlatforms() # このコルーチンはすぐに開始され、ブロック式と同時に実行されます。
block: # このブロック式は ShowAllPlatforms() と同時に直ちに開始されます。このコード ブロックの式はすべて順番に実行されます。
Sleep(HeadStart) # HideAllPlatforms() が実行されるまで HeadStart 秒待ちます。
HideAllPlatforms() # HeadStart 秒後、このコルーチンが実行されます。
ShowAllPlatforms()<suspends> : void =
for (PlatformNumber -> Platform : Platforms):
Logger.Print("Platform{PlatformNumber} is now shown.")
Platform.Show()
Sleep(AppearDelay)
HideAllPlatforms()<suspends> : void =
for (PlatformNumber -> Platform : Platforms):
Logger.Print("Platform{PlatformNumber} is now hidden.")
Platform.Hide()
Sleep(DisappearDelay)
応用編
このチュートリアルでは、Verse を使用して、ゲームの実行中に一連のプラットフォームの可視性を切り替え続ける仕掛けを作成する方法を学習しました。
ここで学習したことを活かして以下を試してみてください。
- プラットフォームが現れて消える順番を変更する。
- 同じ考え方を適用して、小道具移動装置の仕掛け などの他の仕掛けタイプで周期的に関数を呼び出す。