跳转到内容

房间

房间是 联机大厅 的基础能力。实时消息、状态与 RPC、Mirror 传输层都依赖房间流程。

房间能力覆盖进入房间、准备、开始、结束、重赛、离开、运行中换地图,以及玩家加入 / 离开等事件。房间流程通常需要由 IGP 桌面客户端按联调或正式流程启动游戏。

引擎状态说明
UnityPreview已提供完整房间主流程。
GameMaker暂不支持当前 GameMaker 首期不包含房间能力。
Godot开发中预览 runtime 已有房间生命周期调用。
  • 已完成 启动与连接
  • 游戏通过 IGP 桌面客户端启动,并获取联机启动信息。
  • Unity 场景中保留唯一的 IGPRuntimeManager
  • Godot 项目已注册 IGPGodotAutoload
using UnityEngine;
using IGP.UnitySDK;
using IGP.UnitySDK.Models;
public sealed class IGPRoomDriver : MonoBehaviour
{
[SerializeField] private IGPRuntimeManager runtimeManager;
private void OnEnable()
{
runtimeManager.onRoomJoined.AddListener(OnRoomJoined);
runtimeManager.onRoomUpdated.AddListener(OnRoomUpdated);
runtimeManager.onRoomLeft.AddListener(OnRoomLeft);
runtimeManager.onMapChanged.AddListener(OnMapChanged);
}
private void OnDisable()
{
runtimeManager.onRoomJoined.RemoveListener(OnRoomJoined);
runtimeManager.onRoomUpdated.RemoveListener(OnRoomUpdated);
runtimeManager.onRoomLeft.RemoveListener(OnRoomLeft);
runtimeManager.onMapChanged.RemoveListener(OnMapChanged);
}
private async void OnRoomJoined(Room room)
{
Debug.Log($"Joined room {room.id}");
await runtimeManager.SetReadyAsync(true);
}
public async void StartGame()
{
await runtimeManager.StartHostedGameAsync();
}
public async void FinishGame()
{
await runtimeManager.FinishHostedGameAsync();
}
public async void LeaveRoom()
{
await runtimeManager.LeaveHostedRoomAsync();
}
private void OnRoomUpdated(Room room) {}
private void OnRoomLeft(Room room) {}
private void OnMapChanged(IGPMapChangeData mapChange)
{
Debug.Log($"Map changed to {mapChange.currentMapPublicId}");
}
}

如果一局结束后仍然保留同一个房间,IGP 桌面客户端或 lobby 选择新地图后,会通过新的房间快照通知游戏。

Unity 游戏侧监听 onMapChanged

runtimeManager.onMapChanged.AddListener(mapChange =>
{
Debug.Log($"Map changed to {mapChange.currentMapPublicId}");
});

IGPMapChangeData 包含:

字段说明
roomId当前房间 ID
previousMapPublicId / previousMapVersionId变更前地图
currentMapPublicId / currentMapVersionId变更后地图
room已更新后的完整房间快照

onMapChanged 只在同一个房间内地图字段变化时触发。如果是离开旧房间再进入新房间,仍然按 onRoomLeft / onRoomJoined 处理。

引擎检查点
Unity收到 onRoomJoined,调用 SetReadyAsync(true) 成功;运行中换地图时收到 onMapChanged
GameMaker当前不做房间验收。
Godot收到 RoomSnapshotReceived,调用 SetReadyAsync(true) 成功。
  • 无法进入房间:先确认游戏是否由 IGP 桌面客户端启动。
  • Unity 切场景后房间断开:检查是否创建了第二个 IGPRuntimeManager
  • Unity 没收到换地图事件:确认仍在同一个 roomId,且新房间快照里的 mapPublicIdmapVersionId 已变化。
  • ready 未生效:确认已经进入房间后再调用 ready。
  • Godot 收不到房间快照:确认已完成 bootstrap,并建立了房间联机连接。