付録B: サンプルプログラム解説「AcePursuit(レース/タイムサバイバル)」

付録B: サンプルプログラム解説「AcePursuit(レース/タイムサバイバル)」

ゲーム概要

AcePursuit は、航空機を使ったレース/タイムサバイバル系のサンプルです。

チェックポイント、ラップ、車両選択、順位UI、開始・終了カウントダウンなど、大きめのゲームモードに必要な要素がまとまっています。

主な内容

  • RaceTrackCheckpointVector3 でコースデータを定義。
  • GameType でレースとタイムサバイバルを切り替える。
  • TrackData でレース全体の状態、参加者、勝者、カウントダウンを管理。
  • PlayerProfile でプレイヤーごとの車両、ラップ、タイム、UI状態を管理。
  • UIクラスで車両選択、順位、ラップ数、残り時間を表示。
  • SFXやWorldIconでチェックポイント通過や状態変化を見せる。
  • 離脱プレイヤーや無効プレイヤーを検査し、UIや車両を片づける。

読む順番

1. コース定義を見る

最初に RaceTrackCheckpointtracks の流れを見ます。

航空機レースでは、まず「どこを、どの順番で、何周するか」が重要です。チェックポイントの位置、向き、補正用のフラグをデータとして持っている点を確認してください。

2. TrackDataを見る

TrackData は、レース1本分の状態を持つ中心クラスです。

参加者、勝者、開始カウント、終了カウント、ゲーム種別、選択可能な航空機などがここに集まっています。レースが今どの段階にあるかを知りたいときは、まず TrackData を追います。

3. PlayerProfileとUIを見る

プレイヤーごとの状態は PlayerProfile に寄せられています。

車両選択、走行中のタイム、ラップ、順位、スコアボード表示はプレイヤー単位で変わります。TrackData が全体、PlayerProfile が個人、UIクラスが見せ方、という分担で読むと迷いにくいです。

4. 終了処理と離脱処理を見る

WinnerPlayerCompletedTrackPlayerLeftGame などは、レースの終わり方を決める重要な処理です。

大きなモードほど、開始処理より終了処理の方が壊れやすいです。勝者確定、全員完走、途中離脱、UIの閉鎖、車両破棄がどの順番で行われているかを確認してください。

小技

AcePursuit は、定数が先頭付近にまとまっています。

VERSIONdebugPlayerMinimumPlayerToStartMapPlayers、各種カウントダウン値のような調整用の値を上部に寄せておくと、テスト用ビルドの見分けやバランス調整が楽になります。

また、レースとタイムサバイバルを GameType で分けている点も参考になります。ゲーム種別が増えるときは、あちこちに条件分岐を書くのではなく、まず状態や種別を表す値を固定すると読みやすくなります。

結論

AcePursuit は、状態を持つ大きめのゲームモードを読むためのサンプルです。

最初からUIの細部に入らず、コース定義、TrackDataPlayerProfile、勝者確定、離脱処理の順に追ってください。レース以外でも、順番に目標を通過するモードや、参加者ごとの進捗を持つモードに応用できます。