Fusion 2 イントロダクション
概要
Fusion 1.1から2.0への変更点はこちらをご覧ください
Fusionは、Unity用の新しい高性能な状態同期ネットワークライブラリです。一般的なUnityのワークフローに自然に統合できるようなシンプルさを念頭に構築され、データ圧縮・クライアントサイド予測(Client-Side Prediction)・ラグ補償(Lag Compensation)などの高度な機能を標準で提供しています。
Fusion内部では最小のCPUオーバーヘッドで帯域幅を削減する最先端の圧縮アルゴリズムが使用されています。データは結果整合性(Eventual Consistency)のある部分的なチャンクで転送され、関心領域(Area Of Interest:AOI)の設定によって大人数のプレイヤーにも対応します。
FusionのAPIは、通常のUnityのMonoBehaviour
と似たコードで記述できるよう設計されています。例えば、RPCやネットワーク上の状態は、メソッドの属性やMonoBehaviour
のプロパティとして定義され、明示的なシリアライゼーションを必要としません。ネットワークオブジェクトはプレハブで定義され、Nested PrefabやPrefab Variantにも対応しています。
入力・ネットワークプロパティ・RPCは、Fusionでゲームプレイコードを書くための基礎的なAPIになります。
ネットワークプロパティの使用例:
C#
[Networked] public byte life { get; set; }
入力の使用例(クライアントサイド予測による移動):
C#
public override void FixedUpdateNetwork()
{
if (GetInput(out NetworkInputData data))
{
data.direction.Normalize(); // normalize to prevent cheating with impossible inputs
_characterController.Move(5 * data.direction * Runner.DeltaTime);
}
}
リモートプロシージャコール(RPC)の宣言例:
C#
[Rpc(RpcSources.InputAuthority, RpcTargets.StateAuthority)]
public void RPC_Configure(string name, Color color)
{
playerName = name;
playerColor = color;
}
適切なモードの選択
Fusionは同じAPIで、二つのまったく異なるネットワークトポロジーと、ネットワーク接続を行わないシングルプレイモードに対応しています。
Fusionを使い始める際にはまず、サーバー/ホスト(Server/Host)モードか、共有(Shared)モードのどちらを使用するかを選択することになります。
以下のQuadrantは、どのモードがどのアプリケーションに適しているかを判断するのに役立つでしょう。
チュートリアル
使用するモードが決まったのなら、さっそくチュートリアルを始めましょう。
まだ使用するモードが決まらないなら、これ以降の説明を読み進めましょう。
ネットワークトポロジーの違い
サーバーモード(Server Mode)
サーバーモードでは、サーバーが全てのオブジェクトに対する完全かつ独占的な状態権限を持ちます。例外はありません。
クライアントは、入力をサーバーに送信する(そしてサーバーがその入力を反映する)か、RPCを使用して変更をリクエストすることでのみ、ネットワークオブジェクトを変更することができます。
サーバーアプリケーションは、ヘッドレスモードでUnityのビルドを実行します。ビルドは、専用サーバーかクラウドサーバーでホストする必要があります。Photonでは、Fusionのサーバーアプリケーションをホストするためのサーバーは提供していません。
クライアントサイド予測
クライアントサイド予測はマルチプレイで評判の良い技術方式で、サーバーからの応答を待つことなく、クライアントが自身の入力を使って自身の動作を予測します。これによって遅延が隠蔽され、ゲームプレイが軽快になります。
Fusionのサーバーモードでは、クライアントが直接変更するネットワーク上の状態は全てローカル上の予測となり、サーバーから実際の正しいスナップショットを受信すると上書きされます。サーバーから受信した状態までロールバックして、ローカル上の(それまで予測していた)ティックまでの再シミュレーションを進める処理は、サーバーリコンシリエーション(Server Reconciliation)と呼ばれます。
それまでの予測が正確だった場合の処理はシームレスとなり、正確でなかった場合は状態が更新されます。ネットワーク上の状態とレンダリングする状態は分けられているため、新しい状態を即座に描画に反映するか、補間・誤差修正・スムージングなどを使用してビジュアルアーティファクトを軽減しながら描画します。
ホストモード(Host Mode)
ホストモードでは、ホストはサーバーとクライアントを兼用します。ホストはクライアントでもあるので、プレイヤーとして入力のポーリングやレンダリングを行います。
全般的にこのモードはサーバーモードと同等ですが、専用サーバーをホストする必要がない分だけ運用コストは安くなります。しかしこれは信頼性とのトレードオフで、悪意のあるホストのチートを防げません。
ファイアウォールやルーターの内側でホストモードを実行する場合、Photon Cloudは必要に応じてUDPホールパンチングやパケットリレーを透過的に行います。
セッションはホストが所有するため、ホストが通信を切断するとセッションは失われますが、Fusionはホストマイグレーション(Host Migration)機能によって、ホストの通信が切断された場合に新しいクライアントへホスト権限を委譲することができます。ただし、ホストモードでは(共有モードとは異なり)自動で権限の委譲は行われないので、クライアント側で特別な処理を実装する必要があります。
共有モード(Shared Mode)
共有モードでは、ネットワークオブジェクトの権限が各クライアントに分散されます。具体的には、各クライアントは自身がスポーンしたオブジェクトの状態権限を最初に持ちますが、他のクライアントに状態権限を移譲したり、任意で状態権限の取得を許可制にしたりできます。
共有モードでは、クライアントサイド予測やロールバックなどの機能を使用できません。シミュレーションは、全てのクライアントが常に同じティックレートで先に(ロールバックせずに)進みます。
共有モードのセッションはPhoton Cloudが所有していて、接続しているクライアントがいる限り存続します。Photon Cloudはパケットリレーとして動作し、Unity無しでネットワーク上の状態にフルアクセスできるため、専用サーバーを用意することなく軽量なサーバーロジックやデータ検証(チート対策など)を実装できます。
Fusionの共有モードは多くの点でPhoton Unity Networking(PUN)に似ていますが、より機能が充実し、高速で、ランタイムアロケーションのオーバーヘッドがありません。
コスト
全てのモードで同じCCUコストが適用されます。サーバーもクライアントも、接続を管理するために常にPhoton Cloudには接続している必要があります。さらにサーバーモードでは、専用サーバーをホストするための追加コストが発生します。
Back to top