This document is about: QUANTUM 3
SWITCH TO

Motor Dome

Level 4

概要

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を継承し、IConnectionCallbacksIMatchmakingCallbacksIInRoomCallbacksIOnEventCallbackを実装することで、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のブロードフェーズクエリを活用しています。ピックアップは、PhysicsCollider3DOnTriggerEnter3Dを使用して衝突検出を行います。

ブロードフェーズ:

  • 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