「Verse Detonation テンプレート」は、2 つのチームが爆発地点でその設置と解除を競って戦うゲームの作成方法を示しています。
このチュートリアルでは、Verse の仕掛けとマップ インジケーターの仕掛けなどの基本的な仕掛けを使用して、条件に応じてビーコンを表示するなどのゲームプレイ メカニズムを実行します。
このテンプレートは、次のような Verse の概念を示しています。
-
列挙型
-
並行処理
-
race
-
待機
-
概要
次に、この島を理想的な順序で作り直すのに必要な手順の概要を示します。
-
新規プロジェクトを作成 し、島設定を変更 してゲームを設定します。
-
仕掛けを設定します。
-
Verse スクリプトを追加します。
新規プロジェクトを作成してゲームを設定する
-
UEFN を開き、空のプロジェクトを作成します。
-
[Outliner (アウトライナー)] で [IslandSettings] の仕掛けを選択し、[User Options - Game Rules (ユーザー オプション - ゲーム ルール)] を見つけます。
-
以下のように [User Options] を変更します。
オプション | Value | 説明 |
---|---|---|
チーム | チーム インデックス 2 | プレイヤーが 2 人のチームに分けられます。 |
合計ラウンド | 5 | ゲームが終了するまでに 5 ラウンドあります。 |
他のチームの観戦を許可 | オフ | プレイヤーは他のチームを観戦することはできません。 |
無限素材 | オフ | ゲーム中、プレイヤーが所有できる建築素材の数が無限になりません。 |
建築物が環境オブジェクトを破壊できる | オフ | プレイヤーがビルドした構造物を配置した際に、その構造物が重なっている環境の部分を破壊しなくなります。 |
環境ダメージ | なし | プレイヤーがゲーム中、環境にダメージを与えることができなくなります。 |
ツルハシでの破壊 | 無効 | つるはしが環境や建物にダメージを与えなくなります。 |
手動リスポーンを許可 | オフ | プレイヤーが、ゲーム中に リスポーン メニュー オプションを使用できなくなります。 |
チームスコアを使用 | オン | ゲーム内の各チームは、そのプレイヤーの合計を通じて統計を取得します。 |
仕掛けを設定する
このチュートリアルでは、次の仕掛けを使用します。
-
8 x 爆破
-
2 x 時限式破壊オブジェクト
-
4 x マップ インジケータ
-
1 x エンド ゲーム
-
~ x プレイヤー スポーン パッド
-
1 x Verse
爆破仕掛け
爆破 仕掛けを使用して、起爆タイマーを作動させます。マップの反対側に、4 つの爆破仕掛けのグループをコピーして配置します。
この仕掛けを設定するには、[User Options (ユーザー オプション)] を次のように設定します。
オプション | Value | 説明 |
---|---|---|
ダメージの許可 | オフ | この仕掛けはプレイヤーからのダメージを受けなくなります。 |
時限式破壊オブジェクト
時限式破壊オブジェクト の仕掛けは、各サイトの起爆装置として機能します。爆破仕掛けの両方のグループに時限式破壊オブジェクトの仕掛けを配置します。
この仕掛けを設定するには、[User Options (ユーザー オプション)] を次のように設定します。
オプション | Value | 説明 |
---|---|---|
時間 | 30 | 目標のタイマーの長さを決定します。 |
起動時のスコア | 2 | 起動していないタイマーを起動することで付与されるスコアの量を設定。 |
停止時のスコア | 5 | 動いているタイマーの停止に成功した後に与えられるスコアの量を決定します。 |
タイマー ゼロ時のスコア | 3 | タイマーがゼロになった際に得られるスコアの量を設定する。 |
タイマー ラベルのテキスト スタイル | ボールド オレンジ | カウントダウンの表示とカスタムテキストのスタイルを設定する。 |
起動チーム フィルタ | チーム インデックス 1 | どのチームが開始されていないタイマーを開始できるかの設定。 |
起動時のインタラクト テキスト | Arm Bomb (爆弾を設置しよう) | 未起動のタイマーを開始可能なプレイヤー向けのプロンプトとして表示するカスタム テキストを設定します。 |
起動時のインタラクト時間 | 5 | 開始されていないタイマーをスタートするために必要なインタラクト時間の長さを設定する。 |
停止チーム フィルタ | チーム インデックス 2 | どのチームが起動中のタイマーを停止できるかの設定。 |
停止時のインタラクト テキスト | Disarm Bomb (爆弾を解除しよう) | アクティブなタイマーを停止可能なプレイヤー向けのプロンプトとして表示するカスタム テキストを設定します。 |
停止時のインタラクト時間 | 5.0 | 起動中のタイマーを停止するのに必要なインタラクト時間の長さを設定。 |
タイマーの音が届く距離 | マップ全体 | タイマーの音をマップ上のどこかでローカライズするか、聞こえるようにするかを決定します。 |
マップ インジケータの仕掛け
マップ インジケータ の仕掛けを使用すると、ミニマップ上にカスタム マーカーを作成できます。各爆発地点の上に、各チームに 1 つずつ 2 つのマップ インジケーターの仕掛けを配置します。
この仕掛けを設定するには、[User Options (ユーザー オプション)] を次のように設定します。
オプション | Value | 説明 |
---|---|---|
アイコンの色 | 色を選択 | 表示アイコンの色を設定。各チームを表す色を選択してください。 |
テキスト | 爆弾 A - 爆弾 B | マップ インジケータの仕掛けの 1 つのペアに爆弾 A、もう 1 つのペアに爆弾 B と名前を付けます。 |
エンド ゲームの仕掛け
爆弾処理に成功した場合、または 30 秒が経過して Verse スクリプトを介して爆発した場合は、エンド ゲーム の仕掛けによりラウンドを終了します。
この仕掛けを設定するには、[User Options (ユーザー オプション)] を次のように設定します。
オプション | Value | 説明 |
---|---|---|
勝利チーム | 起動チーム | 仕掛けをアクティブにしたチームがゲームに勝利します。 |
終了の対象 | ラウンドを終了する | この仕掛けがゲーム ラウンドを終了します。 |
プレイヤー スポーン パッドの仕掛け
チームの プレイヤー スポーン パッド の仕掛けをマップの反対側にグループ化します。各チームには独自のスポナーがあります。チーム 1 は爆弾の設置を行い、チーム 2 は爆弾の処理を行います。チームの役割はラウンドごとに入れ替わります。
この仕掛けを設定するには、[User Options (ユーザー オプション)] を次のように設定します。
オプション | Value | 説明 |
---|---|---|
プレイヤーのチーム | チーム インデックス 1 - 2 | スポーン パッドの 1 つのセットはチーム インデックス 1 に設定され、もう 1 つのセットはチーム インデックス 2 に設定されます。 |
Verse スクリプトを追加する
まず @editable 関数で仕掛けを参照し、次の Verse スクリプトを追加 します。
コードは、記述されている順にコピーできます。 わかりやすくするため、スクリプト内にコメントが追加されています。
# 爆弾のステートを定義する列挙型
bomb_state<public>:= enum {AllUnarmed, BombAArmed, BombBArmed}
上記のコードは、爆弾の状態を追跡するための列挙型を定義しています。
search_and_destroy := class(creative_device):
Logger:log = log{Channel:=log_search_and_destroy}
@editable
TimedObjectiveA: timed_objective_device = timed_objective_device{}
@editable
TimedObjectiveB: timed_objective_device = timed_objective_device{}
@editable
ExplosiveBarrelsA: []explosive_device = array{}
@editable
ExplosiveBarrelsB: []explosive_device = array{}
@editable
EndGameDevice: end_game_device = end_game_device{}
@editable
BombAMapIndicators: []map_indicator_device = array{}
@editable
BombBMapIndicators: []map_indicator_device = array{}
@editable
BombABeaconArm: beacon_device = beacon_device{}
@editable
BombABeaconDisarm: beacon_device = beacon_device{}
@editable
BombBBeaconArm: beacon_device = beacon_device{}
@editable
BombBBeaconDisarm: beacon_device = beacon_device{}
var BombState:bomb_state = bomb_state.AllUnarmed
@editable で仕掛けを参照できます。
# 実行中のゲームで仕掛けが開始されたときに実行します
OnBegin<override>()<suspends>:void=
# race 式は、2 つ以上の async 式のブロックを並列で (同時に) 実行するために使用されます。最速の式が完了すると、その式が「レースに勝ちます」。
# https://dev.epicgames.com/documentation/ja-jp/uefn/race-in-verse
race:
block:
# 爆弾 A の設置を待ちます
ArmingPlayer:= TimedObjectiveA.StartedEvent.Await()
Print("Bomb A Armed",?Duration:=5.0)
# 有効にするビーコンと爆破される樽の判断に使用されます
set BombState = bomb_state.BombAArmed
# 他の時限式破壊オブジェクトの仕掛けを無効にします
TimedObjectiveB.Disable(ArmingPlayer)
# 爆弾 B のマップ インジケータを無効にします
for (MapIndicator : BombBMapIndicators):
MapIndicator.Disable()
コードの最初のセクションは、爆弾 A と爆弾 B のどちらが最初に設置されたのかを判断するためのレースを使用した 並列処理 を示しています。
block:
# 爆弾 B の設置を待ちます
ArmingPlayer:= TimedObjectiveB.StartedEvent.Await()
Print("Bomb B Armed",?Duration:=5.0)
# 有効にするビーコンと爆破される樽の判断に使用されます
set BombState = bomb_state.BombBArmed
# 他の時限式破壊オブジェクトの仕掛けを無効にします
TimedObjectiveA.Disable(ArmingPlayer)
# 爆弾 A のマップ インジケータを無効にします
for (MapIndicator : BombAMapIndicators):
MapIndicator.Disable()
# 正しいビーコンの仕掛けを有効にして、爆弾を設置します
UpdateBeacons()
# TimedObjective が完了 (Complete) または停止 (Stopped) するまで待ちます
race:
block:
BombDetonated(TimedObjectiveA.CompletedEvent.Await())
block:
BombDetonated(TimedObjectiveB.CompletedEvent.Await())
block:
DisarmingPlayer:= TimedObjectiveA.StoppedEvent.Await()
Print("Bomb Disarmed", ?Duration:=5.0)
EndGameDevice.Activate(DisarmingPlayer)
block:
DisarmingPlayer:= TimedObjectiveB.StoppedEvent.Await()
Print("Bomb Disarmed", ?Duration:=5.0)
EndGameDevice.Activate(DisarmingPlayer)
上記のコードは、時限式破壊オブジェクトが完了するか停止するまでスクリプトが待機する並列処理を示しています。
# 設置解除されたビーコンを無効にして、設置済みの爆弾のビーコンを有効にします
UpdateBeacons():void=
BombABeaconArm.Disable()
BombBBeaconArm.Disable()
if:
BombState = bomb_state.BombAArmed
then:
BombABeaconDisarm.Enable()
else:
BombBBeaconDisarm.Enable()
上記のコードは、設置された爆弾に応じてビーコンの状態を更新します。
BombDetonated(Agent:agent):void=
Print("Bomb Detonated", ?Duration:=5.0)
# どの樽のセットを爆破するかを定義します
if:
BombState = bomb_state.BombAArmed
then:
ExplodeBarrels(ExplosiveBarrelsA, Agent)
else:
ExplodeBarrels(ExplosiveBarrelsB, Agent)
EndGameDevice.Activate(Agent)
上記のメソッドは、時限式破壊オブジェクトの仕掛けが完了すると呼び出されます。 どちらの爆弾が爆発してゲームを終了するかを決定します。
ExplodeBarrels(Barrels:[]explosive_device, Agent:agent):void=
for (Barrel : Barrels):
Barrel.Explode(Agent)
上記の for ループは、正しい爆発地点でそれぞれの樽を爆発させます。
Verse の仕掛け
Verse スクリプトをコンパイルし、その仕掛けを コンテンツ ドロワー で見つけます。Verse の仕掛けをマップの非表示のエリアにドラッグし、設定をカスタマイズします。
この仕掛けを使用し、ディレクト イベント バインディングを必要な仕掛けにリンクすると、Verse スクリプトがそれらの仕掛けを参照できます。
仕掛けの [Details (詳細)] パネルで、上の画像のように、参照される仕掛けそれぞれに合うように設定を構成します。
この仕掛けを設定するには、[User Options (ユーザー オプション)] を次のように設定します。
オプション | Value | 説明 |
---|---|---|
TimeObjectiveA | 時限式破壊オブジェクト BombSiteA | 時限式破壊オブジェクトの仕掛けを爆発地点にリンクします。 |
TimeObjectiveB | 時限式破壊オブジェクト BombSiteB | 時限式破壊オブジェクトの仕掛けを爆発地点にリンクします。 |
ExplosiveBarrelsA | 0 - BarrelBombSiteA_1 | 爆破仕掛けをリンクします。 |
ExplosiveBarrelsA | 1 - BarrelBombSiteA_2 | 爆破仕掛けをリンクします。 |
ExplosiveBarrelsA | 2 - BarrelBombSiteA_3 | 爆破仕掛けをリンクします。 |
ExplosiveBarrelsA | 3 - BarrelBombSiteA_4 | 爆破仕掛けをリンクします。 |
ExplosiveBarrelsB | 0 - BarrelBombSiteB_1 | 爆破仕掛けをリンクします。 |
ExplosiveBarrelsB | 1 - BarrelBombSiteB_2 | 爆破仕掛けをリンクします。 |
ExplosiveBarrelsB | 2 - BarrelBombSiteB_3 | 爆破仕掛けをリンクします。 |
ExplosiveBarrelsB | 3 - BarrelBombSiteB_4 | 爆破仕掛けをリンクします。 |
EndGameDevice | End Game Device2 | エンド ゲームの仕掛けをリンクします。 |
BombAMapIndicators | 0 - Map_Team1_BombsiteA | マップ インジケータの仕掛けを爆発地点にリンクします。 |
BombAMapIndicators | 1 - Map_Team2_BombsiteA | マップ インジケータの仕掛けを爆発地点にリンクします。 |
BombBMapIndicators | 0 - Map_Team1_BombsiteB | マップ インジケータの仕掛けを爆発地点にリンクします。 |
BombBMapIndicators | 1 - Map_Team2_BombsiteB | マップ インジケータの仕掛けを爆発地点にリンクします。 |
BombABeaconArm | BeaconArmBombSiteA | サイト A の爆弾を設置します。 |
BombABeaconDisarm | BeaconDisarmBombSiteA | サイト A の爆弾を解除します。 |
BombBBeaconArm | BeaconArmBombSiteB | サイト B の爆弾を設置します。 |
BombBBeaconDisarm | BeaconDisarmBombSiteB | サイト B の爆弾を解除します。 |
[Launch Session (セッションを開始)] を選択して、完成したレベルをテストします。