Verse Parkour テンプレート では、プレイヤーが戦略的に障害物や段差をすり抜けて、バッテリーを集めるゲーム モードの作成方法を学習できます。
このゲーム モードでは、プレイヤーは 4 つのバッテリーを集めてレベルを完了します。 秘密のバッテリーを見つけると、時間が延長されます。 時間切れになると、プレイヤーは最初に戻されます。
このテンプレートでは、次のような基本的な言語の機能を示しています。
-
For ループ
-
サブスクリプション
-
配列
-
仕掛け API
このテンプレートでは同時並行性など、複雑な概念は使用していません。
概要
次に、この島を理想的な順序で作り直すのに必要な手順の概要を示します。
-
新規プロジェクトを作成 し、島設定を変更 してゲームを設定します。
-
アリーナを構築します。
-
仕掛けを設定します。
-
Verse スクリプトを追加します。
新規プロジェクトを作成してゲームを設定する
-
UEFN を開き、空のプロジェクトを作成します。
-
[Outliner (アウトライナー)] で IslandSettings (島設定) の仕掛けを選択し、[User Options - Game Rules (ユーザー オプション - ゲーム ルール)] を見つけます。
-
以下のように [User Options] を変更します。
オプション Value 説明 Game Win Condition (ゲームの勝利条件) Most Scores Win (最大スコアが勝利) 最も高いスコアのプレイヤーがゲームに勝利します。 Pickaxe Destruction (ツルハシでの破壊) None (なし) ツルハシが環境にダメージを与えることはありません。 Start with Pickaxe (ツルハシを持って開始する) False 最初の武器にツルハシを持ってゲームを開始することはありません。 Auto Pickup Items (アイテム自動取得) Yes (有) ゲーム中にプレイヤーがアイテムに接触すると、自動的に拾います。 Allow Mantling/Sprinting/Sliding/Shoulder Bashing (よじ登り/ダッシュ/スライディング/ショルダー バッシュを許可) True (オン) プレイヤーは環境内でパルクールができます。 Round Win Condition (ラウンドの勝利条件) Score (スコア) 最も高いスコアのプレイヤーがラウンドに勝利します。 First Scoreboard Column (スコアボードの 1 列目) Score (スコア) スコアボードに、1 列目のスコアが表示されます。
アリーナを構築する
このマップでは、「Fortnite」>「Galleries」>「Props」 にある Cyber City Prop Gallery を使用します。
プレイヤーがパルクールする段差や障害物を使用し、このマップを作り直しましょう。
仕掛けを設定する
このチュートリアルでは、次の仕掛けを使用します。
-
アイテム グランター × 5
-
1 x エンド ゲーム
-
ダメージ ボリューム × 1
-
タイマー x 1
-
HUD メッセージ × 1
-
Verse の仕掛け × 1
プレイヤー スポーン パッドの仕掛け

プレイヤー スポーン パッド の仕掛けを使用し、マップにプレイヤーをスポーンさせます。マップの開始地点には、各プレイヤーのスポーン パッドを配置します。このスポーン パッドは、「Fortnite」>「Devices」>「Player Spawn Pad」 にあります。
この仕掛けを設定するには、[User Options (ユーザー オプション)] を次のように設定します。
オプション | Value | 説明 |
---|---|---|
Visible In Game (ゲーム中に表示) | False | この仕掛けは、ゲーム中に表示されません。 |
アイテム グランターの仕掛け

UEFN では、コンテンツ ドロワー から 消耗品 をドラッグすると、アイテム スポナー の仕掛けに自動的にそれが配置されます。バッテリー のアイテムをマップにドラッグします。これは、「Fortnite」>「Consumables」>「Battery」 にあります。
この仕掛けを設定するには、[User Options (ユーザー オプション)] を次のように設定します。
オプション | Value | 説明 |
---|---|---|
Time Before Spawn (スポーンまでの時間) | 0.1 | これは、アイテムがスポーンするまでの時間を決定します。 |
Respawn Item on Timer (タイマーに合わせてアイテムをリスポーン) | False | バッテリーは拾われるとリスポーンしません。 |
Base Visible During Game (ゲーム中にベースを表示) | False | この仕掛けは、ゲーム中に表示されません。 |
Bonus Ammo For Weapons (武器のボーナス弾薬) | False | 武器のボーナス弾薬を獲得することはありません。 |
Run Over Pickup (走り抜けて取得) | True | プレイヤーはアイテムを自動的に拾います。 |
Item Scale (アイテムの拡縮) | 2.0 | これはバッテリーのサイズを決定します。 |
この仕掛けをさらに 4 回コピーおよび貼り付けし、マップに配置します。
エンド ゲームの仕掛け

エンド ゲーム の仕掛けを配置し、アクティベートされたときにゲームを終了します。
この仕掛けを設定するには、[User Options (ユーザー オプション)] を次のように設定します。
オプション | Value | 説明 |
---|---|---|
Custom Victory Callout (勝利コールアウトのカスタマイズ) | テキストを入力 | 勝利したプレイヤーに表示するテキストを入力します。 |
ダメージ ボリュームの仕掛け

ダメージ ボリューム の仕掛けは、ゾーン内のプレイヤーにダメージを与えることができる境界です。この仕掛けをマップの下に配置し、[Zone Width (ゾーンの幅)]、[Depth (奥行き)]、および [Height (高さ)] を調整してアリーナの底をカバーして、落下したプレイヤーがすぐに倒されるようにします。
この仕掛けを設定するには、[User Options (ユーザー オプション)] を次のように設定します。
オプション | Value | 説明 |
---|---|---|
Damage (ダメージ) | 500 | この仕掛けでは、落下したプレイヤーをすぐに倒すのに十分なダメージを与えます。 |
タイマーの仕掛け

タイマー の仕掛けをエンド ゲームの仕掛けの近くに配置します。この仕掛けは、プレイヤーが倒され、最初からやり直さなければならなくなるまでカウント ダウンを行います。
この仕掛けを設定するには、[User Options (ユーザー オプション)] を次のように設定します。
オプション | Value | 説明 |
---|---|---|
Duration (持続時間) | 30 | タイマーは 30 秒間続きます。 |
Start at Game Start (ゲーム開始地点でスタート) | True | ゲームが開始されると、タイマーが開始されます。 |
Applies To (適用対象) | プレイヤー | タイマーが開始されると、特定のプレイヤーに適用されます。 |
Success on Timer End (タイマー終了時に成功) | False | タイマーが最後に達しても、成功としてカウントされません。 |
Visible During Game (ゲーム中に表示) | Hidden (非表示) | この仕掛けは、ゲーム中は非表示です。 |
Timer Running Text (タイマー時間減少テキスト) | テキストを入力 | タイマーに表示するテキストを入力します。 |
HUD メッセージ

HUD メッセージ の仕掛けを使用し、プレイヤーに魅力的なメッセージを表示します。
この仕掛けを設定するには、[User Options (ユーザー オプション)] を次のように設定します。
オプション | Value | 説明 |
---|---|---|
Display Time (表示時間) | 2.0 | メッセージは 2 秒間表示されてから消えます。 |
Show on Round Start (ラウンド開始時に表示) | False | このメッセージはラウンド開始時に表示されませんが、バッテリーを拾ったときに表示されます。 |
Verse スクリプトを追加する
まず @editable 関数で仕掛けを参照し、次の Verse スクリプトを追加 します。
コードは、記述されている順にコピーできます。 わかりやすくするため、スクリプト内にコメントが追加されています。
using { /Fortnite.com/Devices}
using { /Fortnite.com/Characters}
using { /Verse.org/Simulation}
using { /UnrealEngine.com/Temporary/Diagnostics}
log_parkour := class(log_channel){}
# これは Verse で作成されたクリエイティブの仕掛けで、レベル内に配置できます
#このスクリプト例は、時間内に 4 つのバッテリーを集めることが目的のパルクールを表現するものです
#
# はじめに:
# https://dev.epicgames.com/documentation/ja-jp/ja/uefn/learn-programming-with-verse-in-unreal-editor-for-fortnite
parkour_race_script := class(creative_device):
Logger : log = log{Channel:=log_parkour}
# プレイヤー スポナーへの仕掛けの参照
@editable
PlayerSpawnDevice : player_spawner_device = player_spawner_device{}
# 勝利した際のエンド ゲームの仕掛け
@editable
EndGameVictoryDevice : end_game_device = end_game_device{}
# このゲーム モードのタイマー
@editable
TimerDevice : timer_device = timer_device{}
# プレイヤーがバッテリーを取得した際の HUD メッセージ フィードバック
@editable
HUDMessageBattery : hud_message_device = hud_message_device{}
# 使用しているアイテム スポナーの配列。
@editable
BatteryItemSpawners : []item_spawner_device = array{}
@editable
SecretBatteryItemSpawner : item_spawner_device = item_spawner_device{}
# プレイヤーが秘密のバッテリーを拾った際に追加する、調整可能な時間の量
@editable
SecretBatteryTimeReward : float = 10.0
# 現時点で収集済みのバッテリー数を表す整数値の宣言
var BatteriesCollected : int = 0
上のスクリプトは、@editable を使用してクリエイティブの仕掛け、配列、および 浮動小数点数 を UEFN に公開する方法を示しています。スクリプトで後から呼び出すには、仕掛けを Verse で先に定義しておく必要があります。
# バッテリーを収集した際に表示するメッセージ
BatteryCollectedMessage<localizes>(Amount:int) : message = "You collected {Amount} battery"
BatteriesCollectedMessage<localizes>(Amount:int) : message = "You collected {Amount} batteries"
# 秘密のバッテリーを収集した際のメッセージと、完了のメッセージ
AllBatteriesCollectedMessage<localizes> : message = "You collected all of the batteries!"
SecretBatteryCollectedMessage<localizes> : message = "You collected the secret battery, additional time added!"
上のスクリプトは、関数 を定義し、集められたバッテリーの数に基づいてパラメータ化されたメッセージを返す方法を示しています。また、すべてのバッテリーを集めた場合と、秘密のバッテリーを拾った場合に表示するメッセージも定義します。
# この仕掛けのスクリプトが実行中のゲームで開始された際に実行されます
OnBegin<override>()<suspends>:void=
# スクリプトの動作を確認するために、このようにログに出力できます
Logger.Print("Parkour Race Script Started!")
# AgentSpawnedEvent をサブスクライブしています
# プレイヤーがスポーンされると「HandleAgentSpawned」関数が呼び出されます。
PlayerSpawnDevice.SpawnedEvent.Subscribe(HandleAgentSpawned)
# タイマーも同様です。その期限が切れるタイミングをサブスクライブします
TimerDevice.FailureEvent.Subscribe(HandleTimerExpired)
# batteryItemSpawner の配列を確認し、それぞれのアイテム スポナーの ItemPickupEvent をサブスクライブします。
# これをそれぞれのアイテム スポナーに対して行います。先述の AgentSpawnedSubscription と TimerExpiredSubscription で行ったように、ハンドルは保存しません。
# ハンドルを保存する必要はありませんが、ハンドルがないとサブスクリプションをキャンセルできないため、アイテムが拾われた際にはそれが毎回起動します。
for (BatterySpawner : BatteryItemSpawners):
BatterySpawner.ItemPickedUpEvent.Subscribe(HandleBatteryPickedUp)
<# 上記の for ループを実行する別の方法で、配列の確認に整数値を使用します
for (i:int := 0..BatteryItemSpawners.Length - 1):
if (Battery := BatteryItemSpawners[i]):
Battery.ItemPickedUpEvent.Subscribe(HandlebatteryPickedUp) #>
SecretBatteryItemSpawner.ItemPickedUpEvent.Subscribe(HandleSecretBatteryPickedUp)
OnBegin 関数は、拾われたバッテリーのイベントに対する for ループ 中のゲーム開始時の処理を定義します。
# プレイヤー スポーン パッドからエージェントがスポーンされた際に呼び出される関数
HandleAgentSpawned(Agent:agent):void=
Logger.Print("Agent Spawned!")
# プレイヤーのリスポーン時に確実にフルの時間を与えるために、タイマーの仕掛けをリセットします
TimerDevice.Reset(Agent)
TimerDevice.Start(Agent)
上記は、プレイヤーがスポーンしてタイマーがリセットされ、開始し直す際のコードです。
# アイテム スポナーからバッテリー アイテムが拾われた際に呼び出される関数
HandleBatteryPickedUp(Agent:agent):void=
# 集めたバッテリーの数を増分します
set BatteriesCollected = BatteriesCollected + 1
# このようにして、バッテリーの数をログに出力できます。デバッグに便利です
Logger.Print("Number of batteries picked up: {BatteriesCollected}")
# ゲームを終了するのに十分な数のバッテリーを集めたかどうかをチェックします
if:
BatteriesCollected >= BatteryItemSpawners.Length
then:
# 4 つ以上のバッテリーを集めたかどうかをチェックします。集めた場合は勝利となり、EndGame 関数を呼び出します
spawn { EndGame(Agent) }
else:
#このコードは、バッテリーの数が 4 未満の場合に実行されます。プレイヤーを鼓舞する HUD メッセージを表示します
#集めたバッテリーが 1 つの場合は「battery」という HUD メッセージになり、複数の場合は「batteries」と複数形になります
if:
BatteriesCollected = 1
then:
HUDMessageBattery.SetText(BatteryCollectedMessage(BatteriesCollected))
HUDMessageBattery.Show(Agent)
else:
HUDMessageBattery.SetText(BatteriesCollectedMessage(BatteriesCollected))
HUDMessageBattery.Show(Agent)
# 次に、設定した配列の次のアイテム スポナーを取得します
# 配列を「インデックス処理」することでこれを行います。NextBatterySpawner を正しく参照するために、「if」ステートメント内にあります。
if:
NextBatterySpawner := BatteryItemSpawners[BatteriesCollected]
then:
# 次のアイテム スポナーを取得したら、集めるべき次のバッテリーをアクティベートする SpawnItem を呼び出します
NextBatterySpawner.SpawnItem()
上記は、バッテリーが拾われた際の処理を行うコードです。 すべてのバッテリーが拾われた場合は、EndGame メソッドが呼び出されます。 すべて拾われなかった場合は、HUD メッセージがプレイヤーに表示され、次のバッテリーがスポーンします。
HandleSecretBatteryPickedUp(Agent:agent):void=
Logger.Print("Picked up secret battery")
# 追加の時間を加えられるように、残りの時間を取得します
var TimeRemaining:float = TimerDevice.GetActiveDuration( Agent )
var TimeToAdd:float = (TimeRemaining + SecretBatteryTimeReward)
# 追加の時間をタイマーの仕掛けに加えますが、開始時の最初の時間を超えないようにします
TimerDevice.SetActiveDuration(Min(TimeToAdd, TimerDevice.GetMaxDuration()), Agent )
HUDMessageBattery.SetText(SecretBatteryCollectedMessage)
HUDMessageBattery.Show(Agent)
上記は、秘密のバッテリーが拾われた場合にタイマーの仕掛けに時間を追加するコードです。 タイマーの仕掛けの最初の時間である 30 秒を超えないように設定されています。 このコードは、画面上のメッセージも表示します。
# タイマーの期限が切れた際に呼び出される関数
HandleTimerExpired(MaybeAgent:?agent):void=
Logger.Print("Timer Ended")
if (Agent := MaybeAgent?):
エージェント
# プレイヤーを倒します
if:
FortCharacter:fort_character = Agent.GetFortCharacter[]
then:
FortCharacter.Damage(500.0)
上記は、時間切れになった場合にプレイヤーが倒されるコードです。 プレイヤーはその後リスポーンし、タイマーは HandleAgentSpawned メソッドでリセットされます。
# ゲームの終了を処理する非同期関数
EndGame(Agent:agent)<suspends>:void=
HUDMessageBattery.SetText(AllBatteriesCollectedMessage)
HUDMessageBattery.Show(Agent)
# ゲームを終了する前に 3 秒間待機します
Sleep(3.0)
EndGameVictoryDevice.Activate(Agent)
# この仕掛けのスクリプトが停止、またはゲームが終了した際に実行されます
OnEnd<override>():void=
Logger.Print("Verse device stopped!")
上記は、ゲームを終了するコードです。Sleep(3.0) を使用しているのは、非同期 メソッドの使用例です。
Verse の仕掛けを設定する

Verse スクリプトをコンパイルし、その仕掛けを コンテンツ ドロワー で見つけます。Verse の仕掛けをマップの非表示のエリアにドラッグし、設定をカスタマイズします。

仕掛けの [Details (詳細)] パネルで、上の画像のように、参照される仕掛けそれぞれに合うように設定を構成します。
この仕掛けを設定するには、[User Options (ユーザー オプション)] を次のように設定します。
オプション | Value | 説明 |
---|---|---|
PlayerSpawnDevice | Player Spawn Pad (プレイヤー スポーン パッド) | ドロップ ダウンからこのオプションを選択し、仕掛けを参照します。 |
EndGameVictoryDevice | End Game Victory Device (エンド ゲームの勝利の仕掛け) | ドロップ ダウンからこのオプションを選択し、仕掛けを参照します。 |
TimerDevice | タイマー | ドロップ ダウンからこのオプションを選択し、仕掛けを参照します。 |
HUDMessageBattery | HUD Message Device Battery (HUD メッセージの仕掛けのバッテリー) | ドロップ ダウンからこのオプションを選択し、仕掛けを参照します。 |
PlayerSpawnDevice | Player Spawn Pad (プレイヤー スポーン パッド) | ドロップ ダウンからこのオプションを選択し、仕掛けを参照します。 |
BatteryItemSpawners - 0 | Battery Spawner 1 (バッテリー スポナー 1) | ドロップ ダウンからこのオプションを選択し、仕掛けを参照します。 |
BatteryItemSpawners - 1 | Battery Spawner 2 (バッテリー スポナー 2) | ドロップ ダウンからこのオプションを選択し、仕掛けを参照します。 |
BatteryItemSpawners - 2 | Battery Spawner 3 (バッテリー スポナー 3) | ドロップ ダウンからこのオプションを選択し、仕掛けを参照します。 |
BatteryItemSpawners - 3 | Battery Spawner 4 (バッテリー スポナー 4) | ドロップ ダウンからこのオプションを選択し、仕掛けを参照します。 |
SecretBatteryItemSpawner | Battery Spawner - Secret (バッテリー スポナー - 秘密) | ドロップ ダウンからこのオプションを選択し、仕掛けを参照します。 |
SecretBatteryTimeReward | 10.0 | 秘密のバッテリーを拾ったことによる時間の報酬です。 |
[Launch Session (セッションを開始)] を選択して、完成したレベルをテストします。