Boltからの移行
はじめに
ここでは、Photon BoltとPhoton Fusion間のAPIの主な相違点と、Bolt製のゲームをFusionに移植する方法について説明します。
BoltとFusionの概念はほとんど同じですが、使用方法・API・一般的な動作などは異なります。
Fusionのモード
BoltからFusionに移行する際に理解しておくべき重要な点は、Boltはサーバー/ホスト型のトポロジーのみを提供していますが、Fusionはさらに、完全なクライアント主導(PUNと同様)で動作する共有モードを提供しています。
Boltのほとんどの概念は、Fusionのホスト(サーバー)モードに応用可能ですが、共有モードには応用できません。
ここでは、Boltの知識をFusionのホスト(サーバー)モードへ移行する方法を説明します。
相違点
Photon BoltとPhoton Fusion間の主要な相違点は、以下のリストになります。
- Boltの一般的なAPIは、静的クラスのBoltNetworkとBoltMatchmakingからアクセスできました。FusionではNetworkRunnerインスタンスを使用します。
- Fusionは同じ実行ファイルから複数のピアを実行できますが、Boltは1つのみです。つまり、Fusionは同じゲームインスタンスから複数のクライアントを実行できるということです。これはテストやデバッグ目的で便利です。
- Fusionは、NetworkRigidbody/NetworkRigidbody2Dコンポーネントを使用した物理挙動の予測やロールバックに完全に対応していますが、Boltは、開発者が処理/実装する必要があります。どちらもCharacterControllerを取り扱うことができますが、プレイヤーキャラクターを移動させるための基本的な実装として、FusionはNetworkCharacterControllerがあるのに対して、Boltは独自実装が必要です。
類似点
Photon BoltとPhoton Fusion間の主要な類似点は、以下のリストになります。
- FusionにはNetworkObjectの概念があります。これは、Unityのゲームオブジェクトで表され、ピア間でデータを同期するためのネットワークプロパティを持ちます。一方Boltには、BoltEntityという名前の同じ概念があります。NetworkObjectの状態は、NetworkBehaviourのネットワークプロパティで表されますが、Boltでは、Bolt AssetsウィンドウからStateアセットを作成/編集する必要があります。詳細はこちらをご覧ください。
- すべての主要なSDKのイベント(Start・Shutdown・Disconnectなど)は、BoltではGlobalEventListenerインスタンスを使用して処理されますが、FusionではNetworkRunnerに関連付けられたINetworkRunnerCallbacksの実装からイベントにアクセスできます。
- どちらのSDKにもState Authority/Input Authorityの概念があり、BoltではOwnership/Controlと呼ばれていますが、これらは全く同じ意味です。詳細はこちらをご覧ください。
- Boltと同様、Fusionも予測とロールバックのシステムを持ちます。BoltにはBoltEntityのControllerから送信するCommandがありますが、FusionはNetworkObjectのInput Authorityを持つピアのNetworkInputを送信します。Boltがロールバック(状態のリセット)を手動(resetState = trueでExecuteCommand)で行うのに対して、Fusionは新しいフレームを開始してFixedUpdateNetworkメソッドが呼び出される前に自動的に行われます。
- すべての操作中のBoltEntityに対して、BoltはEntityに関連付けられた各EntityEventListenerでSimulateControllerメソッドを呼び出します。FusionではすべてのNetworkObjectに対して、特定のFrameに関連付けられるNetoworkInput(BoltでいうCommand)は1つのみです。これはINetworkRunnerCallbacks.OnInputコールバックの実装で行います。詳細はこちらをご覧ください。
- Fusionのリモートプロシージャコール(RPC)は、BoltではEventと呼ばれます。これらの操作(誰が送信できるか・誰が受信できるか・信頼性)は非常に似ていますが、Fusionはコードから直接定義できるのに対して、BoltはBolt Assetsウィンドウを使用してセットアップする必要があります。詳細はこちらをご覧ください。
- Fusionには、一般的なデータの同期に役立つ様々なビルトインコンポーネントがあります。一例として、NetworkTransformはBoltのTransform Propertyに対応します。どちらもゲームオブジェクトの位置と回転を同期するために使用され、データ間を補間してスムーズな移動を与えることができます。詳細はこちらをご覧ください。
- FusionはArea of Interest(関心領域)APIを使用して、希望するNetworkObjectのみを同期することができます。詳細はこちらをご覧ください。
- どちらのSDKもScene Objectの概念があり、シーンに関連付けられたNetworkObjectが生成されます。シーンがロードされると、それらのオブジェクトはシミュレーションに自動的にアタッチされます。
- どちらのSDKにもLag Compensated Physics Checks(ラグ補償された物理チェック)が実装されており、射撃する人とそのターゲット間のラグを考慮した、当たり判定やレイキャストに使用されます。詳細はこちらをご覧ください。
対応表
| Bolt | Fusion | Description | 
|---|---|---|
| BoltNetwork, BoltMatchmaking | NetworkRunner | Main API entrypoint | 
| BoltEntity | NetworkObject | Represents a Networked Game Object | 
| BoltEntity State Properties | Networked Properties | Set of synchronized properties | 
| GlobalEventListener | INetworkRunnerCallbacks | General Event handling | 
| EntityEventListener | NetworkBehaviour, | Networked Game Object Event handling | 
| BoltNetwork.Instantiate() | NetworkRunner.Spawn() | Creates a new Networked Game Object | 
| BoltNetwork.Destroy() | NetworkRunner.Despawn() | Removes a Networked Game Object from the simulation | 
| BoltEntity.IsOwner | NetworkObject.HasStateAuthority | Signal if the peer can modify the State of a Networked Game Object | 
| BoltEntity.HasControl | NetworkObject.HasInputAuthority | Signal if the peer that can push inputs to a Networked Game Object | 
| Commands | NetworkInput | Control Structure used to predict on Client and alter the State on the Server | 
| Objects | NetworkStructs | Reusable data structures that contain Networked Properties and can be used in more than one State | 
| Events | RPC | Communication method used to transfer pieces of information that does not need to be part of the simulation | 
| Transform Property | NetworkTransform | Built-in support to synchronize the Transform (position and rotation) of a Networked Game Object | 
| BoltNetwork.LoadScene | NetworkSceneManager | API for switching/loading scenes in a synchronized manner |