This document is about: QUANTUM 3
SWITCH TO

次のステップ

このサンプルのUnityプロジェクトとソースコードは、Quantum SDKでシンプルな2Dマルチプレイヤーゲームを構築する方法を学ぶために使用できます。このページでは、アーキテクチャの各要素をより深く理解するためのリソース・リンク・情報を提供します。

シンプルなゲームではありますが、プロジェクトはかなり複雑です。シンプルなゲームループの作成方法を段階的に学ぶなら、Asteroidsチュートリアルの方が適しています。

Quantum SDKの概要や決定論的ロールバックについては、Quantum とは?をご覧ください。

SDK内容の概要については、Quantum SDKとプロジェクト構成をご覧ください。

Quantum基礎

このセクションでは、特にPlatform Shooter 2Dサンプルを掘り下げる上で役立つQuantum製ゲームの基本的な特徴を簡単に紹介します。

QuantumGameSceneにはQuantumMapSceneCollidersゲームオブジェクトが含まれていて、Quantumシミュレーションの一部を表現します。

例えば静的コライダーは、マップのインスペクター上のBakeを押すことで、Quantumマップにベイクされます。

QuantumDebugRunnerゲームオブジェクトは、再生時に現在シーン内でQuantumシミュレーションを開始するために使用されます。ここにはRuntimeConfigプロパティが含まれていて、マップやその他の重要なQuantumコンフィグが起動時にリンクされます。

例えばSystemsConfigは、PlatformShooter2DSystemsConfigアセットを参照します。このファイルには、起動するすべてのQuantumシステムが含まれています。

ゲームメニューシーンからシーンをロードする際は、QuantumDebugRunnerは自動的に無効になります。

Assets/QuantumUser/Simulationフォルダーの中身には、すべてのゲームシミュレーションのソースコードとQTN(Quantumコード生成)ファイルが含まれます。これらはUnityのasmdefを使用して、最終的にシミュレーションDLLに追加されます。

QuantumEntityViewUpdaterゲームオブジェクト下でゲームが実行されている間は、Quantumエンティティビューがスポーンします。例えば、プレイヤーキャラクターエンティティ(UIで選択する)などです。

選択可能なエンティティプロトタイプは、Character_Boy_VariantCharacter_Girl_Variantの2つです。

PlayerSystemクラスは、ISignalOnPlayerAddedシグナルを使用して新規プレイヤーの参加を検知し、アバターの作成方法を制御します。

サンプル機能の実装について

このセクションでは、各機能の実装を詳細に説明します。

新しい 2D Kinematic Character Controller

2D KCCはカプセルコライダーを使用した新規実装で、3D KCCアドオンと同様に、将来的にアドオンとして提供予定です。

また、まもなく廃止予定の標準のKCCとも別物です。

これは、あらゆる2Dプラットフォームゲームに簡単に組み込めるようにしつつ、本格的な機能も充実しています。組み込みオプションはKCC2DConfigアセットから調整可能で、コードを変更することなく多様なゲームプレイスタイルを実現できます。

現時点で実装されている機能の一部を以下に示します。

  • 調整可能なカプセル形状とLayerMask
  • コリジョンとトリガーのソルバー前後のコールバック
  • アダプティブなマルチステップCCD:カプセルの速度と半径に応じてフルパス回数が動的に変化する
  • 反復的めり込み解除ソルバー:反復ごとに動的なナローフェーズのチェック
  • コヨーテタイム・入力バッファ・ダブルジャンプ・壁ジャンプ・ダッシュ:様々なパラメーターからすべて切り替えや調整が可能
  • 斜面・空中制御・空気抵抗・重力係数(重量制御とジャンプ高度)
  • 有限ステートマシン(FREE_FALLING, GROUNDED, SLOPED, WALLED, DASHING, JUMPED, DOUBLE_JUMPED)
  • UI/View用の組み込みイベント(ジャンプ・着地など)

レイキャスト投影ベースのデルタ移動

高速な弾が壁を貫通するのを防ぐ優れたアプローチとして、CCDを使用せずにインクリメンタルなレイキャストを使用する方法があります。方向と速度に基づくレイキャストをチェックすることで、弾の次の動きを予測して当たり判定を行います。

C#

Physics2D.HitCollection hits = frame.Physics2D.LinecastAll(bulletTransform->Position, futurePosition, -1, QueryOptions.HitAll | QueryOptions.ComputeDetailedInfo);
for (int i = 0; i < hits.Count; i++)
{
  var entity = hits[i].Entity;
  ...
  if (entity == EntityRef.None)
  {
    bulletTransform->Position = hits[i].Point;
    // 弾のアクションを多態的に適用する
    data.BulletAction(frame, bullet, EntityRef.None);
    return true;
  }
}

インゲームのキャラクター選択ロビー

インゲームのキャラクター選択は、ゲーム開始前にロビーシーンを作成することの代替手段です。権威サーバーなしにPhoton Realtimeのルームプロパティでロビーを制御する場合、あらゆるエッジケース(同時のチーム選択・タイムアウト処理など)を処理するのが困難なことがあります。

シミュレーション内でキャラクターやチームを選択する方法は、それよりはるかにエラーが発生しにくく安全です。チームの最終的な振り分けは決定論的シミュレーションに基づくため、不正操作されることがありません。

このサンプルでは、シミュレーションを開始しつつ、UIでキャラクターを選択するまで、プレイヤーをゲームに追加するのを遅延させます。

CharacterSelectionUIController.csはUIを処理し、最終的にRuntimePlayerオブジェクトを作成して、プレイヤーの追加をリクエストします。RuntimePlayerコンフィグは、WebhookのAddPlayerを使用したカスタムゲームデータバックエンドから容易に検証可能です。

C#

// 選択したキャラクターからプレイヤーデータを作成する
RuntimePlayer playerData = new RuntimePlayer();
playerData.PlayerAvatar = characterPrototype;

// メニューからプレイヤーの名前の設定を試みる
var menu =
FindAnyObjectByType(typeof(Quantum.Menu.QuantumMenuUIController)) as Quantum.Menu.QuantumMenuUIController;
if (menu != null)
{
  playerData.PlayerNickname = menu.ConnectArgs.Username;
}

// ゲームにプレイヤーを追加する
runner.Game.AddPlayer(playerData);

シミュレーション内のPlayerSystem.csスクリプトは、サーバーがプレイヤー追加リクエストを受け付けた後、ISignalOnPlayerAddedシグナルを購読してプレイヤーアバターを作成します。

C#

EntityRef character = frame.Create(prototypeAsset);
PlayerLink* playerLink = frame.Unsafe.GetPointer<PlayerLink>(character);
playerLink->PlayerRef = player;
RespawnHelper.RespawnRobot(frame, character);

QuantumMenuのカスタマイズ

このゲームサンプルでは、Quantumプロトタイピングメニューのカスタマイズとプレハブバリアントを使用して、Quantumサンプルメニューの見た目を変更しつつ、SDKアップグレードとの互換性を維持しています。

このようなカスタマイズは、素早いプロトタイプ作成や、独自のオンラインメニュー作成方法の参考として活用できます。

Back to top