「Verse Persistence を使用したスピードウェイ レース」テンプレートは、クリエイティブ テンプレート「スピードウェイ レースをデザインする」を UEFN に変換してプロジェクトに次の機能を追加したものです。
Verse Persistence を使用した、第 1 ラウンドでのみ表示される、ゲーム前ロビーにおける永続的ローカル ランキング。
Verse Persistence を使用した、前のラウンドのゴール順に応じて、スタート ラインの車両にプレイヤーを割り当てるシステム。
シネマティックと Verse を使用して、各プレイヤーの統計データを表示するスターティング ラインアップ。
その他多数!
クリエイティブのテンプレート「スピードウェイ レースをデザインする」の目標は、レース トラック アセットを使用して、標準的機能を備えたユニークなレース モードを作成することでした。 この UEFN テンプレートでは、UEFN の強力な能力を活用するために、マップ全体の多くの機能を置き換え、アップグレードするために総合的なアプローチが選択されました。
次のセクションでは、これらの更新について詳しく説明します。
チュートリアル ゾーンをアップグレードする
チュートリアル ゾーンにランキングがあります。 第 1 ラウンドをマップにロードするたびに、プレイヤーは 30 秒かけて最新のランキングを確認し、チュートリアル エリアで情報を収集します。
このエリアはレースの楽しさを求めるプレイヤーをビジュアルでも魅了するために作成されていますが、その名のとおりマップの構築方法に関する詳細情報を提供するためでもあります。 チュートリアル ゾーンはクリエイティブのテンプレートから再設計され、さらに開放感があるように、スカイライトが追加され、自然な Lumen ライトが一部導入されています。
テンプレートを UEFN にロードすると、仕掛けと Verse スクリプトの各グループのセットアップについて読むことができ、テンプレートがどのように構築されているのか、独自の体験に組み込む方法を習得できます。
チュートリアル ゾーンは多くの仕掛けが配置される場所であるため、それらを参照してそのロジックを理解することができます。 これらにはコアの保持の仕掛け、栄誉、および分析が含まれます。 栄誉の仕掛けは、ラップを終了またはレースを終了したときに、XP を付与するだけです。
分析の仕掛けをセットアップして、多様なデータ ポイントを追跡すると、将来の更新でプロジェクトを改善することができます。 このテンプレートでは、各チェックポイントをどのくらいの頻度で完了したのか、およびレース中にシルバー コインをどのくらいの頻度でピックアップしたのかを追跡します。 両方により、特定のチェックポイントやコインに到達するのがどれほどやさしい/難しいのかに関するデータが得られます。 このデータに基づいて、将来のリリースでこれらのオブジェクトの位置や数を調整し、ゲーム全体のフローをさらにシームレスにして、レーシング体験を改善することができます。
アウトライナーをクリーンアップする
プロジェクトを UEFN に変換した後は、整理されていない多数のアセットでアウトライナーがいっぱいになります。
もちろん問題なく動作しますが、乗り物、バリアなどのアイテムの名前には番号が付加されており、プロジェクトの構造を把握するのが難しくなっています。 変換プロセスは、自動的にこれらの番号を追加し、必ずアセットや仕掛けが一意の名前になるようにします。
これを管理するために、ファイル システムがプロジェクトに追加され、その位置と機能に基づいて、すべてのオブジェクトを整理します。 整理するのに時間がかかりますが、このシステムにより、クリエイティブの場合よりはるかに効率的に、全体エリアやオブジェクトのグループを移動や削除できます。
永続的ローカル ランキング
オリジナルのクリエイティブのマップで持続データがないために、前のレースの勝者やプレイヤー統計データを追跡することができませんでした。 更新された UEFN テンプレート マップでは、Verse および Verse Persistence を使用することで、ゲーム セッション全体のプレイヤー データを保存することができ、ライフタイム プレイヤー統計データをモニターし、ローカル ランキングを作成できます。 アクセスできるのは、現在のセッションにいるプレイヤーのプレイヤー データだけであるため、ランキングに反映されるのは、現在プレイしているプレイヤーの統計だけです。
「podiums (表彰台の回数)」と「lap time (ラップ タイム)」が、プレイヤーごとに追跡する、最も重要な永続可能な統計データであると判断しました。 プレイヤーが表彰台に上がるのは、3 位以内でゴールしたときで、ベスト ラップタイムは最速のレーサーを追跡します。 さらに「points (ポイント)」というエクストラ統計データを追加しました。 プレイヤーにはレースでの順位に基づいてポイントが与えられます。つまり、上位を獲得したわけではないが多数のレースに参加したプレイヤーは多くのポイントを獲得する可能性があります。 これらの統計データを使って、熱烈さとスピードと貢献度のすべてにおいて最上位であるレーサーを確認する方法を考案しました。
変換されたテンプレートはレース前のロビーで、各プレイヤーのライフタイム統計データを表示するローカル ランキングを使用します。 これらの統計データはソートされ、ライフタイム ポイント統計データが最高のプレイヤーが一番前に表示され、上位 3 名のプレイヤーはそのスキルを示すために強調表示されます。 これらの統計データは、スターティング ラインナップのシネマティックでも HUD に表示され、プレイヤーは、記録をよく見て、レース中に注意する相手を覚えておくことができます。
永続的ローカル ランキングを作成する方法については、「独自のインゲーム ランキングを作成する」を確認してください。
スタート ラインでのレーサーの順序
変換されたテンプレートでは、オリジナル プロジェクトのスターティング ラインにレーサーがランダムで並ぶ方式から、前のラウンドでのレーサーの実績に基づいて順序を決める方式に置き換えます。 これは、1 位ではないときでも、プレイヤーが早くゴールすることを促します。
第 1 ラウンドでは、レーサーはランダム順でスタートしますが、以降のラウンドでは、前のラウンドでゴールした順でレーサーはスターティングラインに並びます。 この情報はラウンド間で保存しておく必要がありますが、ゲーム終了後は維持しません。 これを使用して、前のラウンドのゴール順に従ってプレイヤーをソートすることでスタート順を決定できます。 ラウンド情報を格納し、データをソートする方法については、次のチュートリアルを確認してください。
# Orders and returns players by their finish order in the previous round.
# During the first round, players are given random starting placements.
GetPlayerStartOrder<public>(Players:[]player):[]player=
var OrderedPlayers:[]player = Players
if:
IsFirstRound[GetRound[]]
then:
# Randomize player order because it's first round.
set OrderedPlayers = Shuffle(OrderedPlayers)
プレイヤーを乗り物に割り当て、スタートラインでセットアップするときに、プレイヤーが実際にアクティブであり、レースに参加することを確認できると便利です。 GetAllValidPlayers() という関数を作成できます。この関数は、すべてのプレイヤーを順に確認し、アクティブであり (ゲームから退出していない)、観戦者ではない (実際にレースに参加する) プレイヤーを返すものです。
# Get all players that are able to race.
GetAllValidPlayers(Players:[]player):[]player=
# Valid players are ones that are active and not spectating.
for:
Player : Players
Player.IsActive[]
not Player.IsSpectator[]
do:
Playerこれらすべてにより、プロジェクトは starting_game_sequence の仕掛けを使用して、第 1 ラウンドでランキング ロビーをセットアップしてから、レース開始前にプレイヤーをスタート位置 (乗り物) に割り当てます。
# This file handles the logic for the pregame lobby and the cinematics that play at the beginning of a race.
# It controls the length of the starting lineup based on the number of players, and plays an intro for each
# player by displaying their stats.
using { /Fortnite.com/Characters }
using { /Fortnite.com/Devices }
using { /Fortnite.com/FortPlayerUtilities }
using { /Verse.org/Native }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
スターティング ライン シネマティックとプレイヤー統計データ
クリエイティブの「スピードウェイ レースをデザインする」テンプレートのオリジナル バージョンでは、パルス トリガーの仕掛けを使用して、レース開始の ready-set-go を調整していました。 パルス トリガーは、トリガーを作動させてテキストを表示したり、スタート ラインのライトを点灯させたりすることで、設定した時間内に一連のイベントを再生しました。
変換されたテンプレートでは、パルス トリガーの仕掛けが UEFN のムービー シーケンスの仕掛けで置き換えられ、グランド オープニングのシネマティックを再生します。 シーケンサーを使用することで、さまざまなカメラ、ヘッドアップ ディスプレイ (HUD) 要素、アクティブ プレイヤーの数に応じて調整されるダイナミックなラインナップ ビューを追加することができます。 パルス トリガーの仕掛けをセットアップした方法と同様に、レベル シーケンスで重要な瞬間に仕掛けをアクティブにして、次のプレイヤーのスコアを表示するタイミングやイントロをカットするタイミングを決定できるようにしています。
具体的には、レベル シーケンスで、プレイヤー イントロの開始時は必ず StartPlayerIntroEvent、プレイヤー イントロの終了時は必ず EndPlayerIntroEvent という、トリガーの仕掛けをアクティブにします。 Verse コードではこの情報を使用して、すでにイントロが表示されているプレイヤー数を判断し、ゲーム内のプレイヤー数と同じになったら、シネマティックの再生を停止します。 シネマティックが先に終了した場合は、プレイヤー イントロの待機もキャンセルします。race 式の中にあるためです。
Verse コードで各プレイヤーに対して WaitForPlayerIntro() を呼び出します。これは各プレイヤーに対してループを開始し、StartPlayerIntroEvent トリガーの仕掛けを待機して、プレイヤーの統計データを HUD に表示するタイミングを把握するために、プレイヤーのスタート順と同じ回数アクティブにします。 これらの WaitForPlayerIntro() ループのそれぞれが ArraySync() 関数で呼び出されます。これは分割統治による並列化アルゴリズムを使用して、複数の非同期関数および配列要素を同期します。
# A Verse-authored creative device that can be placed in a level
starting_game_sequence := class(creative_device):
# The cinematic that intros the players and their stats.
@editable
StartingLineupCinematic:cinematic_sequence_device = cinematic_sequence_device{}
# The cinematic that we cut to after the lineup and before the race starts.
@editable
RaceStartCinematic:cinematic_sequence_device = cinematic_sequence_device{}
このプロジェクトではポップアップ ダイアログの仕掛けを使用して、ウィジェット エディタでウィジェットを設計し、Verse を使って情報を入れ替えます。 ポップアップ ダイアログの仕掛けでボタンにテキストを設定することにより実行します。
# Updates the Popup UI to display the lifetime stats of the given player during the
# race starting sequence.
UpdatePopupUI<public>(Player:agent, PopupDialogUI:popup_dialog_device):void=
if:
CurrentPlayerStats := GetPlayerStats[Player]
then:
PopupDialogUI.SetButtonText(PlayerText(Player), 0)
PopupDialogUI.SetButtonText(PointsText(CurrentPlayerStats.Points), 1)
PopupDialogUI.SetButtonText(PodiumsText(CurrentPlayerStats.Podiums), 2)
BestLapText:message = if(IsValidBestLapTime[CurrentPlayerStats.BestLapTime]):
レベル デザイン
この更新では、風景モードを使用して、オフロード トラックを作成しました。 使用するアセット数を減らすことによりメモリを節約する一方で、トラックを囲む山々には深みを持たせています。 新しいタイプのテレインを作成するために、ウォーター ボリュームと滝も使用して、レース トラックの先の部分に視線が向かうようにしました。
オリジナル プロジェクトのレガシーの昼/夜サイクルから、高度なフォートナイト チャプター 4 のライティングにアップグレードしています。 この新しいサイクルにより、Lumen を使用して、よりソフトなシャドウとリアルなグローバル イルミネーションを作成できるようになりました。
オリジナルのレース トラック テンプレートに 120 個以上のバリアがあることを知っていましたか。 バリアはプレイヤーがトラックから外れないようにして、車両が絶対に境界から飛び出さないようにするために使用されます。 この更新では、バリアが使われるのは、レース開始前にプレイヤーがスタート位置から抜け出さないようにするためだけで、トラックの周りにはありません。 レースのチェックポイント、収集アイテム、いくつかの環境要素を使用して、プレイヤーがトラックにとどまるように促します。
ブースト用コイン:各ラウンドで最終コインの下にスピード ブースト パッドを追加することで、プレイヤーはレース タイムを短縮するために、トラックから外れないようになります。 このコインはラップごとにリスポーンされ、プレイヤーが初回に取り損ねた場合でも、再びピックアップする機会が設けられています。
プレイヤーをトラックにとどめるためのビジュアル デザイン:短い、白いバリアがトラック全体の多くの場所で使用され、意図したトラックの道筋を強調しています。 道路は数台の車両が横に並んで走行できるほどの幅で設計されました。 木や RV などの追加の装飾や小道具、他のデザインは、プレイヤーの乗り物がスタックすることなく、快適に走行できるように配置されていますが、意図しない経路に入るのを防ぐためにも存在します。
ショートカットとジャンプ:オリジナル マップはシンプルな 8 の字コースですが、プレイテストでわかったことは、プレイヤーがショートカットするために好んでジャンプすることです。 新しいデザインでは、数か所のショートカットとジャンプが追加され、マップを完成させる方法をプレイヤーが選択できます。
最後に、意図的に配置されたレース チェックポイントは、プレイヤーがトラックから外れないための最終手段で、それぞれがレースの進行に必要であるためです。