Motor Dome

概要
Quantum Motor Domeサンプルは、最大6人のプレイヤーが参加できる、自由なすべて参加型のスネークのようなスポーツゲームを構築する方法を示しています。このサンプルには、ホストまたは参加するためのハンズオフロビー、自動ゲームステートの進行を実現するカスタムビルドのFSMシステム、ブロードフェーズヒット検出、プレイヤーカスタマイズが含まれています。




始める前に
Photon DashboardからQuantum AppIdを作成し、それをUnityプロジェクトのAssets/Resources
内にあるPhotonServerSettings
アセットのAppId
に貼り付けます。
シーンのドロップダウンからStartScene
を選択し、再生ボタンを押してください。
ダウンロード
Version | Release Date | Download | |
---|---|---|---|
ハイライト
技術的なポイント
- 衝突処理のためのブロードフェーズクエリ
- ゲームステート用のカスタムステートマシン
MapDataBakerCallback
を使用したカスタムベイクマップデータ- プレイヤーのニックネームとキャラクターのカスタマイズ
ゲームプレイ
コアゲームプレイの特徴は以下の通りです:
- プレゲームロビーとポストゲーム画面を含む完全なゲームループ。
- スポーン保護
- ランダムに生成されるピックアップ
- ゲームプレイイベントのためのニュースフィード
プロジェクト
入力
プロジェクトでは、レガシーUnity入力システムを使用しています。
(ゲームパッドの入力はXboxボタンとしてリストされています)
ローカル入力:
P
キーでポーズメニューを開く
量子入力:
A
キーおよびD
キー / 左右矢印 / 左スティックのX軸でステアリングW
キー / 上矢印 / Aボタン / RBでブーストS
キー / 下矢印 / Bボタン / LBでブレーキ
ゲームへの参加
マッチメイキング:
オンラインマッチをプレイするには、マッチメイキング
を選択し、次にキューを開始
を選択します。この時点で、マッチメイカーが動作し、Quantumセッションが開始されます。短い待機期間の後、LoadSyncSystem
がイントロシーケンスに進み、その後ゲームが開始されます。ゲーム状態は完全に自律的であり、進行するためにプレイヤー入力には依存しません。
練習モード:
ソロマッチをプレイするには、Practice
を選択します。ゲームシーンのQuantumRunnerLocalDebug
がQuantumセッションの起動を処理します。イントロフェーズは、LoadSyncSystem
によってスキップされます。
マッチメイカー
QuantumCallbacks
を継承し、IConnectionCallbacks
、IMatchmakingCallbacks
、IInRoomCallbacks
、IOnEventCallback
を実装することで、Matchmakerクラスはゲームへの接続の流れを管理し、さまざまなコールバックを委譲します。主なエントリーポイントは静的なConnect
メソッドで、接続状態が更新されると呼び出し元に信号を返します。
ゲーム状態
ゲーム状態システムは、ゲーム状態インターフェースのいずれかを実装するシステムを有効または無効にします。システムは1つまたは複数のインターフェースを実装でき、それぞれの対応するゲーム状態の間は有効になります。ゲーム状態インターフェースを実装していないシステムは、ゲーム状態システムによって影響を受けません。
ゲーム状態が変化すると、古いゲーム状態と新しいゲーム状態の両方を含むGameStateChanged
イベントが送信されます。このシステムは再利用可能に設計されており、状態を変更または追加するのも容易です。
ゲーム状態システムに関連するファイルは次のとおりです:
pre
quantum.code
└ Game
├ Game State
│ ├ gameState.qtn
│ └ IGameStates.cs
└ Systems
└ GameStateSystem.cs
イベント
EventSubscriptions
クラスは、ほとんどのイベントをリッスンします。すべての「プレイヤー」イベントは、ハンドリングのためにInterfaceManager
に委譲されます。
状態システム:
GameStateChanged
ゲームプレイ:
PickupCollected
PlayerDied
PlayerLeadGained
PlayerReconnected
PlayerScoreChanged
その他:
PlayerLeft
PlayerDataChanged
Shutdown
ShipView
クラスがリッスンするイベント:
PlayerVulnerable
PlayerDataChanged
衝突
プレイヤー間の衝突は、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