Fusion Godot とは?
概要
Photon Fusion Godotは、Godot Engine 4.6向けのGDExtensionアドオンで、スケーラブルなマルチプレイヤーネットワーキング機能を提供します。これによって、ルームベースのマッチメイキング・途中参加にも対応する効率的なステートレプリケーション・物理演算の予測・柔軟なRPCなどが利用可能になります。そして、これらすべての機能は、Godotのノードベースの標準的なワークフローに合わせて設計されています。
Fusionは、あらゆる主要プラットフォームで数千のタイトルを支えた実績のあるPhoton Cloudインフラストラクチャ上で実行されます。Photonがホスティング・スケーリング・グローバルリージョンのルーティングを管理するため、サーバーの管理やメンテナンスは不要です。料金体系はCCUベースで、開発用の無料プランも用意されています。プランなどの詳細は、Pricingをご覧ください。
シンプルな接続とマッチメイキング
マルチプレイヤーゲームを制作する際、プレイヤーを同じセッションへ参加させることは最初の課題となります。FusionはこのすべてのプロセスをGDScript(またはGodot .NetのC#)から直接実行できます。ゲームクライアントはPhoton Cloudのリージョンクラスタからなるグローバルネットワークに接続し、ルーム(プレイヤーが状態を同期したりRPCを送受信するための共有ゲームセッション)にマッチングされます。ルームは、最大プレイヤー数・カスタムプロパティ・ロビーフィルタリングなどを設定できるため、クイックマッチからプライベートなロビーシステムまで、あらゆるマッチメイキングを構築可能です。
サーバーの管理やメンテナンスは必要ありません。Photonはホスティング・スケーリング・世界中のリージョンへのルーティングを一元管理します。
APIの詳細については、接続とマッチメイキングをご覧ください。
GDScript
Fusion.connect_to_photon("player_42", "us") # "us" = Photon Cloud リージョン
Fusion.connected_to_photon.connect(func():
Fusion.join_or_create_room("arena", {"max_players": 8})
)
1つのSDK、2つのネットワークモード
マルチプレイヤーゲームごとに必要な権限管理は異なります。協力プレイのサンドボックスと対戦シューティングゲームとは、根本的に異なる信頼モデルが求められます。Fusionは1つのSDKで、共有権限型(Shared-Authority)とクライアントサーバー型(Client-Server)の両方をサポートします。
共有権限型では、各クライアントがローカルで自身のオブジェクトを所有・シミュレートし、Photonサーバーがワールドの状態のキャッシュを管理します。レプリケーションはプロパティ単位で行われ、変更があった値のみが配信されるため、帯域を低く抑えることができます。試合途中に新しいプレイヤーが参加した場合、自動的に完全な状態のスナップショットが提供されます。
クライアントサーバー型では、シミュレーションサーバー(ホストまたは専用サーバー)がゲームロジックを実行し、すべての状態変化を検証します。クライアントはシミュレーションサーバーへ入力を送信し、サーバーは受信した入力を実行して結果を書き込みます。Photon Cloudは、状態の配信・関心領域フィルタリング・途中参加者用スナップショットを引き続き担当し、シミュレーションサーバーがゲームプレイに専念できるように負荷を分散させます。クライアントは操作性を高めるためにローカルで予測を行い、正しい状態が到着した際に補正が適用されます。
どちらのトポロジーも、基本的なワークフローは同じです。Fusion経由で接続し、FusionSpawnerでオブジェクトをスポーンし、Fusion.rpc()でRPCを送信し、インスペクターからレプリケーションを設定します。レプリケーション用ノードはトポロジーによって異なり、共有権限型ではFusionSharedReplicator、クライアントサーバー型ではFusionServerReplicatorを使用します。どちらも基本的なレプリケーション機能(カスタムプロパティ・スムージング・関心領域)を持ちますが、FusionServerReplicatorはさらに入力のキューイングと予測をサポートします。
どちらのトポロジーが適切なのかを決めるには、トポロジーの選択をご覧ください。
ゲームエンジン優先のインテグレーション
FusionはGodotのイディオムを念頭に置いて設計されています。複製ノード(トポロジーによってFusionSharedReplicatorまたはFusionServerReplicator)は通常の子ノードで、スポーン可能なシーンに追加するだけで、そのオブジェクトツリーの通信を自動的に処理します。継承すべき特別な基底クラスや、複雑なカスタムノード型を覚える必要もなく、エンジンの再ビルドも不要です(FusionはGDExtensionなので、Steam版を含む標準のエンジンでそのまま使用できます)。
ゲームプレイコードはGDScriptで記述し、シーンツリーの使用・シグナルの接続・インスペクター上からのプロパティの設定など、シングルプレイヤーのプロジェクトと同じように作業可能です。
ネットワークオブジェクトの生成も同様です。PackedSceneをFusionSpawnerに登録しspawn()を呼び出すだけで、同じルーム内のすべてのクライアント上でオブジェクトが生成されます。
クイックスタートガイドでは、10分程度で学べる完全なサンプルを解説しています。
GDScript
var player_scene = preload("res://player.tscn")
spawner.add_spawnable_scene(player_scene)
var player = spawner.spawn()
物理とTransformのスムーズな同期
これらは手動で実装する必要がありません。ルートのReplication Modeを「Auto」に設定すれば、Fusionはノード型を検知し、適切なスムージング方式を選択して、関連するプロパティ(位置・回転・速度)を自動的に同期します。
通常、ネットワークレプリケーションは毎秒30回更新されますが、プレイヤーは少なくとも60fpsのスムーズな動作を期待しています。CharacterBodyやNode3Dなどの通常ノードの場合、Fusionの自動レプリケーションは描画フレーム単位で正確なスナップショット補間を行い、オブジェクト所有者の最新ステートへスムーズにブレンドされます。
Rigidbodyノード(2D/3D)の場合、さらにForecast物理演算予測(Forecast Physics Prediction)が行われます。最新の速度と重力から物体の位置を推定し、次の更新を受信した際のズレを穏やかに補正します。Forecastは完全に調整可能で、車輪付きの車両・ボード・その他の繊細な物理挙動を伴うケースで非常に有効です。

剛性・減衰・テレポートのしきい値は、インスペクター上からすべて調整可能です。
調整方法については、物理演算のレプリケーションをご覧ください。
カスタムRPC
レプリケーションは継続的に状態を同期しますが、ゲームには武器射撃・チャットメッセージ・アビリティ発動などの単発イベントも必要です。RPCを使用すると、レプリケーションのバッファに保存することなく、他のクライアント上で関数を呼び出すことができます。Fusionでは3種類のターゲットとして、全員へ送信・特定ロール(マスタークライアント・所有者)へ送信・特定IDのプレイヤーへ送信を提供しています。
またRPCには、オブジェクト対象(FusionReplicator経由で特定のネットワークオブジェクトにルーティングされるもの)とブロードキャスト(登録されたすべての受信者へグローバルに配信されるもの)の2種類が存在します。どちらもGodot標準の@rpcアノテーションを使用し、ネットワークノードのルート参照を含むほとんどの組み込み型をサポートしています。
完全な解説については、RPCをご覧ください。
GDScript
@rpc("any_peer", "call_local")
func take_damage(amount: int):
health -= amount
func attack():
FusionClient.rpc(take_damage, 25)