接続とマッチメイキング
ゲームオブジェクトを同期する前に、プレイヤーはまずサーバーへ接続して、共有セッションのグループに入る必要があります。Photonは2層アーキテクチャを採用していて、クライアントは最初にマッチメイキングのためにマスターサーバーへ接続し、その後にルームをホストするゲームサーバーへ転送されます。ルームは独立したセッションで、プレイヤーのグループがゲーム状態の共有・RPCの交換・オブジェクトの複製を行う場所になります。
このページでは、初期化・サーバーへの接続・ルーム作成/参加/切断を含む、接続ライフサイクル全体について説明します。
AppIDの設定
Fusionの接続にはPhotonのAppIDが必要です。この設定には2つの方法があります。
プロジェクト設定(推奨) — プロジェクト設定 > Fusion > Connectionからfusion/connection/app_idを設定します。これは標準的な方法で、ほとんどのプロジェクトで動作します。
実行時に上書き — 接続前にFusion.set_app_id("your-app-id")を呼び出します。AppIDが実行時に決定される場合(ビルドごとの設定・リモート設定・機能フラグ・その他プロジェクト設定に組み込めない状況)にはこれを使用してください。
GDScript
# 実行時に上書き — connect_to_photon()前に呼び出す必要がある
Fusion.set_app_id("my-runtime-app-id")
app_versionは、connect_to_photon()で明示的に値を渡さない場合は、常にプロジェクト設定(fusion/connection/app_version)から読み込まれます。
接続
connect_to_photon()を使用することで、Photon Cloudに接続できます。パラメーターはすべてオプションで、空の値はプロジェクト設定から読み込まれます:
GDScript
# すべてをプロジェクト設定から読み込む最もシンプルな形
Fusion.connect_to_photon()
# 特定のユーザーIDを指定
Fusion.connect_to_photon("player_123")
# 特定のリージョンを指定(Cloud接続モードを強制的に使用)
Fusion.connect_to_photon("player_123", "us")
Fusion.connect_to_photonを呼び出すと、シーンツリーに内部処理ノードが追加されます。これを_ready()/_enter_tree()内で実行する場合は、呼び出しを遅延させる必要があります:Fusion.connect_to_photon.call_deferred(「player_123」, 「us」)

ルーム操作
Photon Cloudへの接続が完了すると、connected_to_photonシグナルが発火します。そこからルームの作成/参加を行います。
ルームとは、プレイヤーがオブジェクトを同期したりRPCを交換したりするための共有セッションのことです。Fusionには、ルームの作成/参加/退出を行うメソッドが用意されています。
GDScript
Fusion.connect_to_photon("player_123", "us")
# 接続完了を待ち、それから参加する
Fusion.connected_to_photon.connect(func():
# 新しいルームの作成(既に存在する場合は失敗)
Fusion.create_room("my_room", options)
# 既存のルームに参加(ルーム名を空にするとランダム参加)
Fusion.join_room("my_room", options)
# ルームが存在するなら参加、存在しないなら作成
Fusion.join_or_create_room("my_room", options)
)
optionsパラメーターはFusionRoomOptions型です。省略するかnullを渡すと、デフォルト値が適用されます。
ルームオプション
ルームの作成/参加時に、ルームの動作をカスタマイズするFusionRoomOptionsインスタンスを渡すことができます。
| キー | 型 | 説明 |
|---|---|---|
max_players |
int | ルームに参加できる最大プレイヤー数 |
is_visible |
bool | ロビーのクエリにルームが表示されるかどうか |
is_open |
bool | ルームに新しいプレイヤーが参加できるかどうか |
player_ttl_ms |
int | 使用されていないプレイヤースロットが解放されるまでの秒数(ミリ秒) |
empty_room_ttl_ms |
int | 空のルームが破棄されるまでの秒数(ミリ秒) |
lobby_properties |
Array[String] | ロビーのリストに表示されるカスタムプロパティ |
plugins |
Array[String] | このルームでロードするサーバープラグイン名 |
custom_properties |
Dictionary (bool, int, float, String) | ルームのカスタムプロパティ(例:"map"・"game_mode") |
接続ステータス
Fusionは、切断状態・接続中・接続状態・参加中・ルーム内を含む、線形の状態遷移を追跡しています。
STATUS_DISCONNECTED(0) - 未接続STATUS_CONNECTING_TO_PHOTON(1) - Photon Cloudへの接続を確立中STATUS_CONNECTED_TO_PHOTON(2) - Photon Cloud接続済み、ルーム参加可能STATUS_JOINING_ROOM(3) - 参加中STATUS_IN_ROOM(4) - ルーム内、スポーンや同期が可能STATUS_ERROR(5) - 接続エラーSTATUS_DISCONNECTING(6) - Photon Cloudから切断中
クエリメソッド: is_initialized(), is_connected_to_photon(), is_in_room(), is_master_client(), get_local_player_id(), get_network_time()
シグナル
シグナルを使用することで、フレーム毎にステータスをポーリングすることなく、接続やルームのイベントに反応できます。
room_joined- 正常にルームに入った(安全にオブジェクトをスポーン可能)room_left- ルームを抜けた(自発的 or 切断)connection_failed(error: String)- 接続の試行が失敗connection_status_changed(status: int)- ステータスが変更されたconnected_to_photon- Photon Cloudへ接続したdisconnected_from_photon- Photon Cloudから切断したplayer_joined(player_id: int, user_id: String)- リモートプレイヤーがルームに参加したplayer_left(player_id: int, is_inactive: bool)- リモートプレイヤーがルームから抜けた(そのプレイヤーは、ルームのplayer_ttl_ms猶予期間中はis_inactiveがtrueとなり、再参加が可能)scene_load_requested(index: int, path: String)- シーン変更がリクエストされた(カスタムロードモード)scene_ready(index: int)- ロード後にすべてのシーンオブジェクトが登録されたscene_unloaded(index: int, path: String)- シーンがアンロードされた
切断
disconnect_from_photon()を呼び出すと、現在のルームを退出してPhoton Cloud接続を閉じます。
GDScript
Fusion.disconnect_from_photon()
Photon Cloudからの切断中、connect_to_photon呼び出しはすべて失敗します。
切断直後に再接続したい場合は、disconnected_from_photonシグナルを待つ、またはget_connection_status()がSTATUS_DISCONNECTEDを返すまでポーリングしてください。
シングルプレイヤーモード
Fusionはオフラインシングルプレイヤーモードの実行にも対応しています。このモードでは、Fusionのノードやコードが、オンラインのルームに接続されているかのように動作します。
シングルプレイヤールームに入るには、Photon Cloudに接続していない状態でFusion.create_singleplayer_room()を呼び出してください。Fusionが既にPhoton cloudに接続している場合は、まずdisconnect_from_photon()を呼び出す必要があります。
GDScript
# Photon Cloud接続中は、シングルプレイヤールームを作成できないため、
# シングルプレイヤールームに入る前に、正常に切断されるまで待つ必要がある
if Fusion.is_connected_to_photon():
Fusion.disconnect_from_photon()
await Fusion.disconnected_from_photon
Fusion.create_singleplayer_room()
シングルプレイヤールームに入ると、FusionReplicator・RPC・FusionSpawner・シーンローディング・Fusionライフタイムシグナル(room_joined・player_joined・scene_readyなど)は、すべてオンラインのルームと同様に動作します。クライアントが現在シングルプレイヤールーム内にいるかどうかを確認するには、Fusion.is_singleplayer()を使用してください。
シングルプレイヤールーム内では、一部の機能の動作が若干異なります:
Fusion.get_room()は、常にnullを返します。Fusion.get_local_player_id()は、常に1を返します。Fusion.get_network_time()はローカル時間となり、Engine.time_scaleとget_tree().pausedの影響を受けます。- ローカルプレイヤーはすべての複製ノードに対して、常に権限(状態権限と入力権限)を持ちます:
FusionReplicator.has_authority()は、常にtrueを返します。FusionReplicator.get_authority()は、常に1を返します。FusionSharedReplicator.want_authority(bool)は、所有権モードにかかわらず、何も行いません。FusionServerReplicator.has_input_authority()は、常にtrueを返します。FusionServerReplicator.get_input_authority()は、常に1を返します。FusionServerReplicator.set_input_authority(int)は何も行いません。
シングルプレイヤールームから切断するには、Fusion.leave_room()を使用してください。
実装例
Photon Cloudへ接続し、カスタムオプションを設定してルームに参加し、プレイヤー参加時にメッセージを表示するスクリプトの全容です。
GDScript
extends Node
func _ready():
Fusion.room_joined.connect(_on_room_joined)
Fusion.connection_failed.connect(func(e): print("Failed: ", e))
Fusion.connect_to_photon.call_deferred("player_%d" % randi())
Fusion.connected_to_photon.connect(func():
var options := FusionRoomOptions.new()
options.max_players = 8
options.is_visible = true
options.lobby_properties = ["map"]
options.custom_properties = {"map": "arena"}
Fusion.join_or_create_room("lobby", options)
)
func _on_room_joined():
print("In room as player ", Fusion.get_local_player_id())
Last updated on
Back to top