ルーム
ルームは マルチプレイヤーロビー の基礎機能です。リアルタイム通信、状態と RPC、Mirror transport はすべてルームフローに依存します。
ルーム機能は、ルーム参加、ready、開始、終了、再戦、退出、およびプレイヤー参加 / 退出イベントをカバーします。ルームフローでは通常、連携テストまたは正式フローに従って IGP デスクトップクライアントからゲームを起動する必要があります。
サポートしているエンジン
Section titled “サポートしているエンジン”| エンジン | 状態 | 説明 |
|---|---|---|
| Unity | Preview | 完全な主要ルームフローを提供しています。 |
| GameMaker | 未対応 | 現在の GameMaker 初回公開版にはルーム機能は含まれません。 |
| Godot | 開発中 | プレビュー runtime にはルームライフサイクル呼び出しがあります。 |
- 起動と接続 が完了している。
- ゲームが IGP デスクトップクライアントから起動され、マルチプレイヤー起動情報を受け取っている。
- Unity シーンに
IGPRuntimeManagerが 1 つだけ保持されている。 - Godot プロジェクトで
IGPGodotAutoloadが登録されている。
using UnityEngine;using IGP.Multiplayer;
public sealed class IGPRoomDriver : MonoBehaviour{ [SerializeField] private IGPMultiplayerRuntime runtimeManager;
private void OnEnable() { runtimeManager.RoomChanged += OnRoomChanged; runtimeManager.ConnectionChanged += OnRealtimeConnectionChanged; }
private void OnDisable() { runtimeManager.RoomChanged -= OnRoomChanged; runtimeManager.ConnectionChanged -= OnRealtimeConnectionChanged; }
private void OnRoomChanged(IGPRoomChangedEvent change) { Debug.Log($"Room {change.Kind}, flags={change.Changes}, id={change.Room?.id}"); }
private async void OnRealtimeConnectionChanged(IGPMultiplayerConnectionChangedEvent change) { if (change.IsReady && runtimeManager.CurrentRoomData.hostId == runtimeManager.PlayerId) { await runtimeManager.SetSceneGateAsync("arena-ready"); } }
public async void StartGame() { await runtimeManager.StartHostedGameAsync(); }
public async void FinishGame() { await runtimeManager.FinishHostedGameAsync(); }
public async void LeaveRoom() { await runtimeManager.LeaveHostedRoomAsync(); }
}SceneGate は hosted room snapshot のフィールドではなく、現在の RoomNode runtime room が保持する KCP state です。すべての client は CurrentSceneGate を読み、SceneGate flag 付きの RoomChanged を監視できます。host は realtime 接続後に SetSceneGateAsync を呼び出します。途中参加または再接続した client は realtime が ready になった後に GetSceneGateAsync を呼び出し、Owner からの対象指定 response によって local value が非同期に更新されます。この値は RoomNode runtime room の破棄時に自然に消えます。
GameMaker は現在、ルーム機能をサポートしていません。
Godot では現在、autoload 経由でルーム機能を呼び出すことを推奨します。
using Godot;using IGP.GodotSDK.Autoload;
public partial class RoomPanel : Control{ private IGPGodotAutoload IGP => GetNode<IGPGodotAutoload>("/root/IGP");
public override void _Ready() { IGP.RoomSnapshotReceived += OnRoomSnapshotReceived; IGP.RoomEventReceived += OnRoomEventReceived; }
public async void Ready() { await IGP.SetReadyAsync(true); }
public async void StartGame() { await IGP.StartHostedGameAsync(); }
public async void FinishGame() { await IGP.FinishHostedGameAsync(); }
private void OnRoomSnapshotReceived(string connectionStatus) {} private void OnRoomEventReceived(int eventType, string roomId) {}}Godot はまだ開発中です。現在のサンプルは主に評価と導入方法のすり合わせに使います。
セルフテスト
Section titled “セルフテスト”| エンジン | 確認項目 |
|---|---|
| Unity | realtime 接続後に host が SetSceneGateAsync("arena-ready") を呼ぶと、全 client が KCP 経由で更新値を取得できる。 |
| GameMaker | 現在はルーム検証の対象外です。 |
| Godot | RoomSnapshotReceived を受け取り、SetReadyAsync(true) が成功する。 |
よくある問題
Section titled “よくある問題”- ルームに入れない: まずゲームが IGP デスクトップクライアントから起動されているか確認してください。
- Unity でシーン切り替え後にルームが切断される: 2 つ目の
IGPRuntimeManagerが作成されていないか確認してください。 - Unity の SceneGate が更新されない: 呼び出し元が現在の host で、realtime/KCP が接続済みか確認してください。
- Godot でルームスナップショットを受け取れない: bootstrap が完了し、ルームマルチプレイヤー接続が確立されているか確認してください。