Motor Dome
概要
Quantum Motor Domeサンプルは、最大6人のプレイヤーが自由に参加できるスネークゲームの制作方法を示します。このサンプルには、ホスト/参加を自動化したロビー機能・独自実装のFSMシステムによる自動的なゲームステート進行・ブロードフェーズの当たり判定・プレイヤーのカスタマイズなどが含まれます。
始める前に
PhotonEngine ダッシュボードからQuantumのAppIdを作成し、UnityプロジェクトのAssets/Resources内のPhotonServerSettingsアセットのAppIdフィールドに貼り付けてください。
それから、ScenesドロップダウンからStartSceneを選択して、再生ボタンを押してください。
ダウンロード
| Version | Release Date | Download |
|---|---|---|
| 3.0.8 | 10月 21, 2025 | Quantum Motor Dome 3.0.8 |
ハイライト
技術
- 衝突を処理するブロードフェーズクエリ
- ゲームステート用の独自ステートマシン
MapDataBakerCallbackを使用したカスタムベイクマップデータ- プレイヤー名の設定と、キャラクターのカスタマイズ
ゲームプレイ
主要なゲームプレイには、次の機能が含まれます。
- 完全なゲームループ:ゲーム開始前ロビー・ゲーム終了後画面
- スポーンの保護
- ランダムにスポーンするピックアップアイテム
- ゲームプレイイベントのニュースフィード
プロジェクト
入力
プロジェクトでは、レガシーなUnity Input Systemを使用しています。
(ゲームパッドの入力は、Xboxのボタンに対応します)
ローカル入力:
Pキー:ポーズメニューを開く
Quantumの入力:
AとDキー / 左右矢印キー / 左スティックのX軸:ステアリングWキー / 上矢印キー / Aボタン / RB:ブーストSキー / 下矢印キー / Bボタン / LB:ブレーキ
ゲームへの参加
マッチメイキング:
オンラインマッチをプレイするには、Matchmakingの次にStart Queueを選択します。この時点で、マッチメイキングが行われ、Quantumセッションが開始されます。少しの時間の後、LoadSyncSystemがイントロシーケンスに進み、その後ゲームが開始されます。ゲームステートは、プレイヤー入力に依存せず、完全に自律的に進行します。
練習モード:
ソロマッチをプレイするには、Practiceを選択します。ゲームシーンのQuantumRunnerLocalDebugがQuantumセッションを開始し、イントロフェーズはLoadSyncSystemからスキップされます。
マッチメイキング
Matchmakerクラスは、QuantumCallbacksを継承し、IConnectionCallbacks・IMatchmakingCallbacks・IInRoomCallbacks・IOnEventCallbackを実装することで、ゲーム接続フローを管理して様々なコールバックを移譲します。主なエントリーポイントは静的Connectメソッドで、接続ステートが更新されると呼び出し元にシグナルを返します。
ゲームステート
ゲームステートシステムは、任意のゲームステートインターフェースを実装するシステムを有効/無効にします。システムは一つ以上のインターフェースを実装可能で、対応するゲームステートが存在する間で有効化されます。ゲームステートインターフェースを実装していないシステムは、ゲームステートシステムの影響を受けません。
ゲームステートが変更されると、新旧ゲームステートを含むGameStateChangedイベントが送信されます。
システムは再利用できるよう設計されていて、容易にステートの変更や追加が可能です。
ゲームステートシステム関連のファイルは次の通りです。
pre
quantum.code
└ Game
├ Game State
│ ├ gameState.qtn
│ └ IGameStates.cs
└ Systems
└ GameStateSystem.cs
イベント
EventSubscriptionsクラスは、ほとんどのイベントを購読します。すべての「プレイヤー」イベントは、InterfaceManagerに委譲されて処理されます。
ステートシステム:
GameStateChanged
ゲームプレイ:
PickupCollectedPlayerDiedPlayerLeadGainedPlayerReconnectedPlayerScoreChanged
その他:
PlayerLeftPlayerDataChangedShutdown
ShipViewクラスが購読するイベント:
PlayerVulnerablePlayerDataChanged
コリジョン
プレイヤー間の衝突には、Quantumのブロードフェーズクエリを活用しています。ピックアップアイテムの衝突判定には、PhysicsCollider3DとOnTriggerEnter3Dを使用します。
ブロードフェーズ:
ShipCollisionInjectionSystem.cs:各船体の軌跡の各セグメントに対して、ラインキャストクエリが追加されます。ShipCollisionRetrievalSystem.cs:船体と軌跡の衝突を評価し、自身の軌跡の端と衝突している船体を区別します。
ピックアップアイテム:
PickupSystem.cs:ピックアップアイテムとの衝突は、船体がOnDynamicTriggerEnterコールバックフラグ付きのPhysicsCollider3Dを持つこと、ピックアップアイテムがIsTriggerにチェックが入ったPhysicsCollider3Dを持つことに依存します。これらはエンティティプロトタイプで構成されており、UnityプロジェクトのAssets/Resources/DB/Quantum Prefabsで確認できます。
カスタムベイクマップデータ
このサンプルでは、MapDataアセットのUserAssetフィールドを利用して、マップに追加情報を関連付けています。詳細な情報は、マップベイクをご覧ください。
Quantum:
MapMeta.cs:スポーンポイントの位置と、プレイエリアのサイズと原点を保持します。
Unity:
MapDataMeta.cs:MapMetaアセットにベイクされた情報を持つMonoBehaviourです。CustomMapBaker.cs:MapDataBakerCallbackを継承し、ビュー側のマップデータをQuantum側のMapMetaアセットにベイクします。
カスタマイズ
Unity:
LocalData.cs:Quantumに送信される前の、カスタマイズデータを保持します。
Quantum:
RuntimePlayer.User.cs:プレイヤー名・船体のプロトタイプ・選択色をシリアライズします。ビュー側では、フレームのGetPlayerDataメソッドからRuntimePlayerを取得することで、これらの値にアクセスできます。
以下のスニペットは、ColorRGBAをシリアライズする方法を示します。アルファ値は使用されないため、シリアライズ不要です。そのため、各色は3バイトのみを使用します。
C#
partial void SerializeUserData(BitStream stream)
{
/* ... */
stream.Serialize(ref primaryColor.R);
stream.Serialize(ref primaryColor.G);
stream.Serialize(ref primaryColor.B);
/* ... */
}
サードパーティーアセット
このサンプルゲームは、「Nthusia Studio」によってPhoton Engine用に開発されました。
Back to top