1. 系统概述
Boss Room项目采用了基于Unity Gaming Services (UGS) Lobby服务的房间管理系统,结合自定义的连接管理框架,实现了完整的房间创建、加入、管理和销毁功能。系统支持两种连接方式:直接IP连接和通过Relay服务的网络连接。
2. 核心组件架构
2.1 连接管理层
ConnectionManager.cs- 连接状态机核心控制器:
- 管理所有连接状态的切换(离线、客户端连接中、客户端已连接、主机状态等)
- 处理NetworkManager的回调事件
- 提供启动主机/客户端的接口
- 实现连接状态转换逻辑
ConnectionMethod.cs- 连接方法抽象基类:
ConnectionMethodIP:直接IP连接实现ConnectionMethodRelay:通过Relay服务的连接实现- 负责配置网络传输参数和连接信息
ConnectionState目录- 连接状态机实现:
- 实现不同连接状态的行为逻辑
- 处理状态间的转换
2.2 Lobby服务层
LobbyServiceFacade.cs- 房间管理核心实现:
- 封装与Lobby API的交互
- 提供房间创建、加入、快速加入等功能
- 处理房间事件订阅和更新
- 实现房间心跳机制
LobbyAPIInterface.cs- Lobby API接口封装:
- 直接调用Unity Services Lobby API
- 实现房间查询、创建、加入、更新等操作
- 处理分页和过滤
LocalLobby.cs- 本地房间数据管理:
- 维护房间的本地表示
- 同步远程房间数据
- 提供房间用户管理
LocalLobbyUser.cs- 本地用户数据管理:
- 维护用户的本地状态
- 处理用户数据更新
3. 核心功能与流程
3.1 房间创建流程
- 用户通过UI请求创建房间(LobbyUIMediator.CreateLobbyRequest)
- 验证用户身份(AuthenticationServiceFacade.EnsurePlayerIsAuthorized)
- 调用LobbyServiceFacade.TryCreateLobbyAsync创建房间
- 设置本地房间状态(LocalLobby.ApplyRemoteData)
- 启动主机连接(ConnectionManager.StartHostLobby)
- 设置Relay连接(如果使用)
- 订阅房间事件(SubscribeToJoinedLobbyAsync)
3.2 房间加入流程
- 用户通过UI请求加入房间(LobbyUIMediator.JoinLobbyRequest)
- 验证用户身份
- 调用LobbyServiceFacade.TryJoinLobbyAsync加入房间
- 设置本地房间状态
- 启动客户端连接(ConnectionManager.StartClientLobby)
- 设置Relay连接(如果使用)
- 订阅房间事件
3.3 房间管理
房间事件处理:
- 通过WebSocket订阅房间变化事件
- 处理房间更新、删除、用户加入/离开等事件
- 实现主机离开检测和自动断开逻辑
房间数据更新:
- 更新玩家数据(UpdatePlayerDataAsync)
- 更新房间数据(UpdateLobbyDataAndUnlockAsync)
- 维护房间心跳(DoLobbyHeartbeat)
房间销毁:
- 主机可以主动删除房间(DeleteLobbyAsync)
- 房间自动清理机制
- 处理房间删除事件
4. 设计模式与架构原则
4.1 状态机模式
- ConnectionManager采用状态机模式管理连接状态
- 每个状态(如OfflineState、ClientConnectingState等)封装特定状态的行为
4.2 外观模式
- LobbyServiceFacade作为房间管理的外观类,简化API调用
- 隐藏底层Lobby API的复杂性
4.3 观察者模式
- 使用事件系统(如LobbyChanged、KickedFromLobby等)处理房间变化
- 实现松耦合的组件通信
4.4 策略模式
- ConnectionMethodBase提供连接策略的抽象
- ConnectionMethodIP和ConnectionMethodRelay实现不同的连接策略
5. 与其他系统的集成
5.1 与Relay服务集成
- ConnectionMethodRelay实现与Relay服务的交互
- 创建Relay分配并获取加入代码
- 配置UnityTransport使用Relay连接
5.2 与认证服务集成
- AuthenticationServiceFacade确保用户已认证
- 使用认证ID作为玩家唯一标识
5.3 与Netcode集成
- ConnectionManager与NetworkManager紧密集成
- 处理NetworkManager的各种事件
- 管理网络连接的生命周期
6. 性能与安全性考虑
6.1 性能优化
- 实现API调用的速率限制(RateLimitCooldown)
- 使用WebSocket事件订阅代替轮询
- 优化房间数据同步
6.2 安全性
- 使用认证服务确保用户身份
- 房间访问控制(公开/私有)
- 主机权限管理
7. 代码优化建议
7.1 错误处理增强
- 增加更多的错误处理和重试机制
- 提供更详细的错误信息
7.2 代码模块化
- 进一步拆分LobbyServiceFacade的功能
- 提高代码的可测试性
7.3 文档完善
- 为核心API添加更详细的注释
- 提供使用示例和流程图
8. 总结
Boss Room项目的房间管理系统采用了分层架构设计,结合UGS Lobby服务和自定义连接管理框架,实现了功能完整、性能优良的房间管理功能。系统支持多种连接方式,提供了丰富的房间管理API,并与其他系统(如Relay、认证、Netcode等)紧密集成。
通过使用状态机、外观、观察者和策略等设计模式,系统实现了良好的可扩展性和可维护性。代码结构清晰,职责分明,遵循了良好的软件工程实践。
以下是使用Unity.Services.Lobbies进行基本多人游戏大厅功能开发的步骤:
1. 前提条件
- 安装 Unity Services 包:在 Unity 编辑器中,打开 “Window” -> “Package Manager”,搜索 “Unity Services” 并安装相关包,确保
Unity.Services.Lobbies包已安装。 - 初始化 Unity Services:在项目启动时,初始化 Unity Services。可以在
MonoBehaviour的Start方法中添加以下代码:
usingUnityEngine;usingUnityEngine.Services.Core;publicclassUnityServicesInitializer:MonoBehaviour{asyncvoidStart(){awaitUnityServices.InitializeAsync();// 初始化完成后可以进行其他操作,如登录等}}2. 创建大厅
- 导入必要命名空间:在脚本顶部添加
using Unity.Services.Lobbies;和using Unity.Services.Lobbies.Models;。 - 创建大厅函数:
usingUnityEngine;usingUnityEngine.UI;usingUnity.Services.Lobbies;usingUnity.Services.Lobbies.Models;usingSystem.Threading.Tasks;publicclassLobbyCreator:MonoBehaviour{publicintmaxPlayers=4;publicstringlobbyName="My Lobby";publicButtoncreateButton;asyncvoid