Fusion Godot とは?
概要
Photon Fusion Godotは、Godot Engine 4.6向けのGDExtensionアドオンで、スケーラブルなマルチプレイヤーネットワーキング機能を提供します。あらゆる主要プラットフォームで数千のタイトルを支えた実績のあるインフラを基盤として構築されていて、ルームベースのマッチメイキング・途中参加にも対応する効率的なステートレプリケーション・物理演算の予測・柔軟なRPCなどが利用可能です。また、すべての機能はGodotのノードベースの標準的なワークフローに合わせて設計されています。
シンプルな接続とマッチメイキング
マルチプレイヤーゲームを制作する際、プレイヤーを同じセッションへ参加させることは最初の課題となります。FusionはこのすべてのプロセスをGDScript(またはGodot .NetのC#)から直接実行できます。ゲームクライアントはPhoton Cloudのリージョンクラスタからなるグローバルネットワークに接続し、ルームインスタンスにマッチングされます。ルームは、最大プレイヤー数・カスタムプロパティ・ロビーフィルタリングなどを設定できるため、クイックマッチからプライベートなロビーシステムまで、あらゆるマッチメイキングを構築可能です。
サーバーの管理やメンテナンスは必要ありません。Photonはホスティング・スケーリング・世界中のリージョンへのルーティングを一元管理します。
APIの詳細については、接続とマッチメイキングをご覧ください。
GDScript
FusionClient.connect_to_server("player_42", "us")
FusionClient.connected_to_server.connect(func():
FusionClient.join_or_create_room("arena", {"max_players": 8})
)
共有権限レプリケーション
従来のクライアントサーバー型のネットワーキングでは、一人のプレイヤーがホストとなるため、他すべてのプレイヤーはそのホストの環境やハードウェアに依存します。一方Fusionは共有権限(Shared Authority)モデルを採用していて、各クライアントがローカルで自身のオブジェクトを所有・シミュレートし、Photon Fusionサーバーがワールドの状態のキャッシュを管理します。試合中に新しいプレイヤーが参加した場合、自動的に状態のスナップショットを受信するため、状態の転送を手動で行う必要はありません。
レプリケーションはプロパティ単位で行われます。Fusionは個別の値(位置・体力・スコアなど)を追跡し、前回の更新以降に実際に変更があった値のみを通信するため、帯域を低く抑えつつ、オブジェクトごとの完全な一貫性を維持します。より大規模なワールドや複雑なケースでは、関心領域(Area of Interest)によって動的な領域を指定し、近くのオブジェクトの更新情報のみを受信できるため、100人以上のプレイヤー規模にもスケーリング可能です。
さらなるセキュリティが必要な場合はカスタムサーバーサイドプラグインをデプロイして、状態変更が他のクライアントに届く前に検証を行うこともできます。これは対戦ゲームのチート対策に役立ちます。
詳細は、レプリケーションと関心領域をご覧ください。
ゲームエンジン優先のインテグレーション
FusionはGodotのイディオムを念頭に置いて設計されています。FusionReplicatorは通常の子ノードで、スポーン可能なシーンに追加するだけで、そのオブジェクトツリーの通信を自動的に処理します。継承すべき特別な基底クラスや、複雑なカスタムノード型を覚える必要もなく、エンジンの再ビルドも不要です(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)
次のステップ
- クイックスタートガイド — 10ステップでマルチプレイヤーデモを作成
- SDKのダウンロード — 要件とインストール方法
- 接続 — 初期化・ルーム・シグナル
- レプリケーション — 権限・複製モード・プロパティ
- 関心領域 — 広大なワールドの空間フィルタリング
- スポーン — 動的なネットワークオブジェクトとサブオブジェクト
- RPC — リモートプロシージャコール
- 物理のレプリケーション — 剛体のForecastスムージング