チュートリアルとは異なり、このチュートリアルでは、Verse を使用して特定の機能を可能にします。 このチュートリアルで Verse を使用することで、以下を実行することができます。
アニメーションを断続的にトリガーおよび再生して、ゲームプレイ メカニックを作成する。
ミニゲームのすべてのプレイヤーに対する、このプレイヤーのスコアを更新する。
プレイヤーのスポーン遅延および断続的なアイテム スポーン回数を作成する。
このコードを再利用して、以下のタスクを行うことができます。
ハブからゲームプレイへ、およびゲームプレイからハブへのゲームのトランジション中に、有効および無効になっている仕掛けを切り替える。
プレイヤーのスコアを確認して、勝利スコアを見つけ出し、それをハブに表示する。
ミニゲームの終了時に、ゲームを終了し、再生をハブにテレポートする。
Verse の仕掛けと編集可能オブジェクトのセットアップ
次の手順に従って Verse の仕掛けと編集可能 オブジェクトを設定します。
レベルに「
tiltnboom」という名前の Verse の仕掛けを新しく作成します。 手順については、「Verse を使用して独自の仕掛けを作成する」を参照してください。以下の モジュールをファイルの先頭に追加します。
Verseusing { /Fortnite.com/Characters } using { /Fortnite.com/Devices } using { /Fortnite.com/Game } using { /UnrealEngine.com/Temporary/Diagnostics } using { /Verse.org/Random } using { /Verse.org/Simulation }以下のフィールドを
tiltnboomのクラス定義に追加します。ActivateGameTrigger と EndGameTrigger という名前の、2 つの編集可能な
トリガーの仕掛け。ActivateGameTriggerは、このゲームをアクティブ化するために使用されます。 このトリガーは、ゲームへのテレポーターなどによって、またはイントロ シネマティックの後にトリガーできます。EndGameTriggerは、ミニゲームを終了するため、およびゲームが終了した後にすべてのカメラとコントロールの仕掛けをプレイヤーから除去するために使用されます。
Verse@editable ActivateGameTrigger:trigger_device = trigger_device{} @editable EndGameTrigger:trigger_device = trigger_device{}GameTimer という名前の編集可能なタイマーの仕掛け。 これは、一定時間経過後にゲームを終了させます。
CannonballSequencesという名前のムービー シーケンスの仕掛けの配列。この配列内の各仕掛けは異なる砲弾着地位置を再生します。ゲーム ステートに基づいて有効および無効にする、DamageVolumes という名前のダメージ ボリュームの配列。
ゲーム中にランダムな数のアイテムをランダムにスポーンする、ItemSpawners という名前のアイテム スポナーの配列。
CaptureArea という名前のキャプチャー エリアの仕掛け。 これは、ボート上にいるためのポイントをプレイヤーに与え、ゲーム ステートに基づいて有効または無効になります。
ScoreManagerという名前のスコア マネージャーの仕掛け。これは、ゲームの開始時にリセットされ、ゲームの終了時に勝利プレイヤーを決定します。HUBTeleporterという名前のテレポーター。これは、ゲームの終了後にすべてのプレイヤーをハブに戻します。PlayerReference という名前のプレイヤー参照の仕掛け。これは、ゲーム間に勝利プレイヤーをハブに表示します。
Verse@editable GameTimer:timer_device = timer_device{} @editable CannonballSequences:[]cinematic_sequence_device = array{} @editable DamageVolumes:[]damage_volume_device = array{} @editable
PlayerSpawnersとHUBSpawnersという名前の、プレイヤー スポーン パッドの 2 つの編集可能な配列。 これらは、ミニゲームが終了したときにスポーンを無効にし、ミニゲームの終了後にプレイヤーをハブに戻します。Verse@editable PlayerSpawners:[]player_spawner_device = array{} @editable HUBSpawners:[]player_spawner_device = array{}MinimumItemSpawnTimeとMaximumItemSpawnTimeという名前の 2 つの編集可能な浮動小数値。 これらは、ボートでのアイテムのスポーンの間で待機する最小時間と最大時間です。Verse@editable MinimumItemSpawnTime:float = 5.0 @editable MaximumItemSpawnTime:float = 10.0DelayAfterGameという名前の編集可能な浮動小数値。 これは、ゲームの終了時にプレイヤーをハブに戻すテレポートの遅延時間です。Verse@editable DelayAfterGame:float = 5.0DelayBetweenCannonballSequencesという名前の浮動小数値。 これは、ミニゲームの持続時間中にシーケンス間で砲弾をスポーンするための遅延時間です。VerseDelayBetweenCannonballSequences:float = 8.0ゲームがアクティブであるかどうかを判断するための、
GameActiveという ロジック 変数。Versevar GameActive:logic = false
ゲームを開始する
ミニゲームの開始時に、いくつかの仕掛けが有効になり、プレイヤー スコアが 0 にリセットされます。
tiltnboomのクラス定義の上で、ミニゲームに特有のメッセージを出力するためのログ チャンネルを追加します。 その後に、ログ チャンネルで使用するロガーをクラス定義に追加します。Versetiltnboom_log_channel := class(log_channel){} # A Verse-authored creative device that can be placed in a level tiltnboom := class(creative_device): Logger:log = log{Channel := tiltnboom_log_channel}InitiatingAgentを受け取ってゲームを開始する新しい メソッドOnTriggeredをtitnboomのクラス定義に追加します。 ゲームがすでに実行中であればゲームが開始されないようにするために、ゲームがすでにアクティブであるかどうかを返す if 式を追加します。VerseOnTriggered(InitiatingAgent:?agent):void= if (GameActive?): return spawn{StartGame()}OnBegin()内で、ActivateGameTrigger のTriggeredEventを、ゲームを開始するOnTriggered関数でサブスクライブします。 ミニゲームの開始時に有効になっている必要がある仕掛けで、このイベントをサブスクライブし、OnTrigger イベントがトリガーされたときに有効にします。VerseOnBegin<override>()<suspends>:void= ActivateGameTrigger.TriggeredEvent.Subscribe(OnTriggered)ゲームを開始するためのロジックを処理する新しいメソッド
StartGame()を追加します。 この関数に<suspends>修飾子を追加して、非同期的に実行できるようにします。まず、
GameActiveをtrueに設定して、ゲームがアクティブであることを伝えます。次に、CaptureAreaと、DamageVolumes配列内の各DamageVolumeを有効にします。プレイヤーごとに、プレイヤーのスコアが 0 より大きければ、現在のスコアの逆の値をプレイヤーに付与してスコアをリセットすることで、スコアを 0 に設定します。
その後に、タイマーの終了、砲弾のシーケンスの実行、ランダムなアイテムのスポーンを race 式にします。 砲弾のシーケンスとランダムなアイテムのスポーンは無限ループですが、タイマーが終了するとすぐにキャンセルされます。
ゲームの終了時に、
OnGameFinished()関数を呼び出して、ゲーム終了時のクリーンアップを処理します。VerseStartGame()<suspends>:void= Logger.Print("Starting game.") set GameActive = true CaptureArea.Enable() for (DamageVolume : DamageVolumes): DamageVolume.Enable() for:
砲弾のループを作成する
このセクションでは、砲弾のムービー シーケンスを再生する関数を追加します。
砲弾のレベル シーケンスを再生し、ループを使用して式の遅延を再生し、砲弾の間に遅延を挿入する、新しいメソッド
StartCannonSequence()をtiltnboomのクラス定義に追加します。 この関数に<suspends>修飾子を追加して、非同期的に実行できるようにします。ループ内で、
GetRandomInt()でインデックス付けすることによって、CannonballSequences配列内のシーケンスをランダムに選択します。 そのシーケンスを再生した後に、別のシーケンスを再生する前にDelayBetweenCannonballSequences時間だけスリープします。VerseStartCannonSequence()<suspends>:void= loop: RandomCannonballSequence:int = GetRandomInt(0, CannonballSequences.Length - 1) if (CannonballSequence := CannonballSequences[RandomCannonballSequence]): Logger.Print("Set CannonballSequence to {RandomCannonballSequence}") CannonballSequence.Play()
ランダムなアイテムのスポーンのループを作成する
このセクションでは、ボート上のランダムな位置でランダムなアイテムのスポーンをループする関数を作成します。これによって、プレイヤーがミニゲームで勝利するチャンスが広がることも損なわれることもあります。
SpawnRandomItemsという新しいメソッドをtitlnboomのクラス定義に追加します。 このメソッドは、ボートにスポーンされるアイテムを制御します。ItemSpawners配列にあるアイテムの数を取得し、その配列でループします。 ランダムなintを使用して、配列からランダムなアイテム スポナーを取得し、それをアクティブ化します。 アイテムのスポーンの間で、ランダムな時間だけスリープします。このループでは、スポーンするアイテムの数がランダムに決定し、
NumberOfItemsToSpawnの回数だけ、スポーンする 1 つのアイテムをランダムに選択します。DelayBetweenItemSpawnsは、スポーン間で待機する不確定な時間を生成します。VerseSpawnRandomItems()<suspends>:void= ItemSpawnerCount:int = ItemSpawners.Length - 1 loop: NumberOfItemsToSpawn:int = GetRandomInt(0, ItemSpawnerCount) # Spawn a randomly selected item, as many times as NumberOfItemsToSpawn. for: CurrentItemSpawnNumber := 0..NumberOfItemsToSpawn
ゲームを終了する
ミニゲームの終了時に勝利者のスコアをハブに送信し、仕掛けを無効にし、プレイヤーをテレポートしてハブに戻す必要があります。
tiltnboomクラス定義に新しいメソッドOnGameFinishedを追加します。 ゲームが終了したときに、この関数はゲームを非アクティブに設定し、関連がある仕掛けを無効にします。~~~(verse) OnGameFinished()<suspends>:void= Logger.Print("Game is finished.") set GameActive = false
CaptureArea.Disable()
for (PlayerSpawner : PlayerSpawners): PlayerSpawner.Disable()
for (DamageVolume : DamageVolumes): DamageVolume.Disable() ~~~
スコアが最も高いプレイヤーを追跡するための
variable intHighestScore、およびそのプレイヤーへの任意指定の参照変数WinningPlayerを追加します。Versevar HighestScore:int = -1 var WinningPlayer:?agent = falsefor/do 式内で、プレイ空間にいるすべてのプレイヤーを取得し、それぞれのプレイヤー用の
FortCharacterを取得します。PutInStasis()を使用してそのキャラクターをその場にフリーズし、プレイヤーがゲームを称賛できるようにエモートと旋回を許可するstasis_argsの新しいセットを渡します。Versefor: Player : GetPlayspace().GetPlayers() FortCharacter := Player.GetFortCharacter[] do: FortCharacter.PutInStasis(stasis_args{AllowTurning := true, AllowEmotes := true})if文内で、各プレイヤーのスコアをチェックして勝利スコアを見つけ、それをハブのプレイヤー参照の仕掛けに格納します。Verseif (ScoreManager.GetCurrentScore(Player) > HighestScore): set HighestScore = ScoreManager.GetCurrentScore(Player) set WinningPlayer = option{Player}最後に、もう一つの if 文内で、勝利スコアが見つかった場合に
TeleportPlayersToHUB()を呼び出して、すべてのプレイヤーをテレポートしてハブに戻します。Verseif(Winner := WinningPlayer?): PlayerReference.Register(Winner) TeleportPlayersToHUB()
プレイヤーをテレポートしてハブに戻す
スコアが算出されて勝利者が公表されたら、すべてのプレイヤーをテレポートしてハブに戻します。
新しいメソッド
TeleportPlayersToHUB()を tiltnboom のクラス定義に追加します。 このメソッドは、すべてのプレイヤースポナーを有効にし、数秒待ってから、すべてのプレイヤーをテレポートしてハブに戻します。 このメソッドは、EndGameTriggerをトリガーして、プレイヤーからカメラとコントロールの仕掛けを除去します。VerseTeleportPlayersToHUB()<suspends>:void= for (HUBSpawner : HUBSpawners): HUBSpawner.Enable() Sleep(DelayAfterGame) EndGameTrigger.Trigger()for式内で、各プレイヤーをテレポートしてHUBTeleporterに戻し、プレイヤーを静止状態から解放します。Versefor: Player : GetPlayspace().GetPlayers() FortCharacter := Player.GetFortCharacter[] do: HUBTeleporter.Teleport(Player) Sleep(1.0) FortCharacter.ReleaseFromStasis()
応用編
このコードを変更して、タイマーの仕掛けで行う異なるタスクを作成します。 ミニゲームの存続期間を決めておくのではなく、タイマーの仕掛けを使用して時間を決めることができます。
using { /Fortnite.com/Characters }
using { /Fortnite.com/Devices }
using { /Fortnite.com/Game }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /Verse.org/Random }
using { /Verse.org/Simulation }
tiltnboom_log_channel := class(log_channel){}
# A Verse-authored creative device that can be placed in a level