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 |