Quantum 3 とは?
概要
Quantumは、Unity製オンラインマルチプレイヤーゲーム向けの高性能な決定論的ECS(Entity Component System)フレームワークで、プレイヤー数は128人まで対応します。
予測/ロールバック方式を採用しているため、スポーツゲーム・格闘ゲーム・FPSなど、遅延の影響を受けやすいオンラインゲームに最適で、遅延が大きいネットワーク接続でも高い安定性があります。
Quantumは無料から開発できます。今日から制作を始めてゲームをリリースし、無料枠を超えるほど人気になった時にのみ料金が発生します。Quantumのプランによって、小規模なタイトルを大きく成長させることが可能です。

最先端の技術スタックは、以下の要素で構成されています。
- 予測/ロールバックを備えたサーバー管理のシミュレーション
- スパースセットECSメモリモデルとAPI
- 決定論的ライブラリ一式(数学・2D/3D物理・ナビゲーション・アニメーション・ボットなど)
- 充実したUnity Editorとの統合ツール
これらはすべて成熟し業界実績がある、既存Photon製品とインフラ(Photon Realtimeのトランスポートレイヤー・サーバーロジックをホストするPhoton Serverプラグインなど)上で構築されています。
予測/ロールバックによるネットワーキング
決定論的システムでは、ゲームクライアントはプレイヤー入力のみを交換し、シミュレーションは各クライアント上でローカルに実行されます。
ゲームクライアントは入力を予測することで自由にローカルでシミュレーションを進め、高度なロールバックシステムによりゲームの状態の復元/再シミュレーションで予測ミスを修正します。開発者が定義したプレイヤー入力はすべてのクライアントに配布され、それ以外のネットワークコードを記述する必要はありません。
Quantumは、Photon Server上で動作するゲームに依存しない権限サーバーコンポーネントによって、クロック同期と入力遅延管理を行います。ロックステップは存在しないため、クライアントは遅いクライアントや通信状況が悪いクライアントを待つ必要はありません。
サーバーコンポーネントを拡張して、開発者がホストするバックエンドシステムと統合することができます(例:マッチメイキング・プレイヤーサービス・権限「レフェリー」シミュレーション)

Unityとは分離されたQuantum ECSを使用して、独自のゲームコードを独立したピュアC#シミュレーションとして記述できます。Quantumのインターフェースは、あらゆるゲームで使用できる広範囲の決定論的APIを提供しています(例:ベクトル数学・2D/3D物理エンジン・ナビゲーション経路探索・アニメーション・ボット)。
Entity Component System
すべてのシミュレーションコードを標準で高性能にするために、Quantumは高性能なスパースセットEntity Component System(ECS)モデルに基づいています。
高性能の鍵は、ポインタを使用したC#コードと独自ヒープアロケーターの組み合わせです。シミュレーションコードで、実行時にC#ヒープメモリ割り当ては発生せず、ガベージコレクションも発生しません。
これは、予測/ロールバック固有の予測ミスによって起こる再シミュレーションを含め、ビュー/レンダリング(例:Unity)のために、CPUに十分な余力を残すことが目的です。
コード生成
Quantumでは、すべてのゲームプレイデータ(ゲーム状態)は、スパースセットECSデータ構造(エンティティとコンポーネント)か独自のヒープアロケーター(動的コレクションと独自データ)に置かれ、常にBlittableなメモリアライメントされたC#構造体になります。
QuantumではパフォーマンスのためにポインタベースでC#を使用します。Qtnと呼ばれるシンプルなドメイン固有言語(DSL)を使用することで、複雑性やボイラープレートコードは開発者から隠蔽され、ゲームデータのC#コードが自動的に生成されます。
Qtn
// components define reusable game state data groups
component Resources
{
Int32 Mana;
FP Health;
}
DSLでは、構造体・C言語スタイルの共用体・列挙型・フラグ・ビットセット・リスト・ディクショナリーなどを定義して使用できます。
APIから自動的に生成される、エンティティ(コンポーネントに基づく)の生成/破棄・反復処理・修正の包括的な機能によって、ゲーム状態を簡単にクエリ/修正できます。
C#
var es = frame.Filter<Transform3D, Resources>();
// sets the entity ref and pointers to the components
while (es.NextUnsafe(out var entity, out var transform, out var resources)) {
transform->Position += FPVector3.Forward * frame.DeltaTime;
}
ステートレスシステム
QuantumのDSLはデータ定義を担いますが、ゲーム状態を更新する独自のゲームロジックを組み込む方法が必要になります。
開発者のゲームロジックの記述は、システムで実装します。システムはステートレスなロジックの一部で、Quantumクライアントのシミュレーションループで毎ティック実行されます。すべてのゲーム状態はFrame
に保持され、Update()
関数から渡されます。
C#
public unsafe class LogicSystem : SystemMainThread
{
public override void Update(Frame f)
{
// customer game logic here
// (f is a reference for the generated game state container).
}
}
QuantumとUnity
QuantumとUnityは分離されていて、Quantumシミュレーションの入出力通信は明確に定義されています。

アセットデータベース
Unityは柔軟なエディターとアセットパイプラインを備えています。アセットはQuantumで定義し、具体的にUnityで作成したアセットがQuantumに共有されるため、ゲームデザイナー/レベルデザイナーは、通常のUnityと同様の柔軟性で作業することができます。

これらのアセットはもちろんUnityでも利用可能です。
入力
入力の定義は必須で、サーバーに毎ティック送信して、すべてのゲームクライアントに配布されます。これは通常、キーボード/コントローラーのボタンや、マウス/コントローラーのスティックの位置など、ゲームに必要なもののサブセットになります。
コマンド
コマンドは、不定期なアクションで使用されます。これらは、必要な時にのみ送信されます。
イベント
イベントは、QuantumシミュレーションからUnityビューへ情報を送信する方法になります。
完全なシミュレーション状態
Unityからは、Quantumの完全なシミュレーション状態が取得できます。一般的な例として、Quantumのエンティティに対応したゲームオブジェクトのtransform
を同期したりすることが、標準で可能です。詳細はエンティティプロトタイプをご覧ください。例えば、キャラクターのライフのようなゲーム固有の要素は、単純にシミュレーション状態から値を読み込んで、ゲーム表示に反映させることができます。
次のステップ
Quantumを始めるなら、Asteroids Tutorialから始めることを強く推奨します。このチュートリアルは、Quantumを始めるために必要な基礎のすべてが学べます。これはテキストも動画(英語)も用意されています。
Back to top