This document is about: QUANTUM 3
SWITCH TO

Motor Dome

Level
INTERMEDIATE
Topology
DETERMINISTIC

概要

Quantum Motor Domeサンプルは、最大6人のプレイヤーが自由に参加できるスネークゲームの制作方法を示します。このサンプルには、ホスト/参加を自動化したロビー機能・独自実装のFSMシステムによる自動的なゲームステート進行・ブロードフェーズの当たり判定・プレイヤーのカスタマイズなどが含まれます。

始める前に

PhotonEngine ダッシュボードからQuantumのAppIdを作成し、UnityプロジェクトのAssets/Resources内のPhotonServerSettingsアセットのAppIdフィールドに貼り付けてください。
それから、ScenesドロップダウンからStartSceneを選択して、再生ボタンを押してください。

ダウンロード

VersionRelease DateDownload
3.0.810月 21, 2025Quantum Motor Dome 3.0.8

ハイライト

技術

  • 衝突を処理するブロードフェーズクエリ
  • ゲームステート用の独自ステートマシン
  • MapDataBakerCallbackを使用したカスタムベイクマップデータ
  • プレイヤー名の設定と、キャラクターのカスタマイズ

ゲームプレイ

主要なゲームプレイには、次の機能が含まれます。

  • 完全なゲームループ:ゲーム開始前ロビー・ゲーム終了後画面
  • スポーンの保護
  • ランダムにスポーンするピックアップアイテム
  • ゲームプレイイベントのニュースフィード

プロジェクト

入力

プロジェクトでは、レガシーなUnity Input Systemを使用しています。
(ゲームパッドの入力は、Xboxのボタンに対応します)

ローカル入力:

  • Pキー:ポーズメニューを開く

Quantumの入力:

  • ADキー / 左右矢印キー / 左スティックのX軸:ステアリング
  • Wキー / 上矢印キー / Aボタン / RB:ブースト
  • Sキー / 下矢印キー / Bボタン / LB:ブレーキ

ゲームへの参加

マッチメイキング:
オンラインマッチをプレイするには、Matchmakingの次にStart Queueを選択します。この時点で、マッチメイキングが行われ、Quantumセッションが開始されます。少しの時間の後、LoadSyncSystemがイントロシーケンスに進み、その後ゲームが開始されます。ゲームステートは、プレイヤー入力に依存せず、完全に自律的に進行します。

練習モード:
ソロマッチをプレイするには、Practiceを選択します。ゲームシーンのQuantumRunnerLocalDebugがQuantumセッションを開始し、イントロフェーズはLoadSyncSystemからスキップされます。

マッチメイキング

Matchmakerクラスは、QuantumCallbacksを継承し、IConnectionCallbacksIMatchmakingCallbacksIInRoomCallbacksIOnEventCallbackを実装することで、ゲーム接続フローを管理して様々なコールバックを移譲します。主なエントリーポイントは静的Connectメソッドで、接続ステートが更新されると呼び出し元にシグナルを返します。

ゲームステート

ゲームステートシステムは、任意のゲームステートインターフェースを実装するシステムを有効/無効にします。システムは一つ以上のインターフェースを実装可能で、対応するゲームステートが存在する間で有効化されます。ゲームステートインターフェースを実装していないシステムは、ゲームステートシステムの影響を受けません。
ゲームステートが変更されると、新旧ゲームステートを含む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のブロードフェーズクエリを活用しています。ピックアップアイテムの衝突判定には、PhysicsCollider3DOnTriggerEnter3Dを使用します。

ブロードフェーズ:

  • ShipCollisionInjectionSystem.cs:各船体の軌跡の各セグメントに対して、ラインキャストクエリが追加されます。
  • ShipCollisionRetrievalSystem.cs:船体と軌跡の衝突を評価し、自身の軌跡の端と衝突している船体を区別します。

ピックアップアイテム:

  • PickupSystem.cs:ピックアップアイテムとの衝突は、船体がOnDynamicTriggerEnterコールバックフラグ付きのPhysicsCollider3Dを持つこと、ピックアップアイテムがIsTriggerにチェックが入ったPhysicsCollider3Dを持つことに依存します。これらはエンティティプロトタイプで構成されており、UnityプロジェクトのAssets/Resources/DB/Quantum Prefabsで確認できます。

カスタムベイクマップデータ

このサンプルでは、MapDataアセットのUserAssetフィールドを利用して、マップに追加情報を関連付けています。詳細な情報は、マップベイクをご覧ください。

Quantum:

  • MapMeta.cs:スポーンポイントの位置と、プレイエリアのサイズと原点を保持します。

Unity:

  • MapDataMeta.csMapMetaアセットにベイクされた情報を持つMonoBehaviourです。
  • CustomMapBaker.csMapDataBakerCallbackを継承し、ビュー側のマップデータを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