news 2026/3/21 14:57:19

Netcode for GameObjects Boss Room 多人RPG战斗(15)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Netcode for GameObjects Boss Room 多人RPG战斗(15)

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 房间创建流程

  1. 用户通过UI请求创建房间(LobbyUIMediator.CreateLobbyRequest)
  2. 验证用户身份(AuthenticationServiceFacade.EnsurePlayerIsAuthorized)
  3. 调用LobbyServiceFacade.TryCreateLobbyAsync创建房间
  4. 设置本地房间状态(LocalLobby.ApplyRemoteData)
  5. 启动主机连接(ConnectionManager.StartHostLobby)
  6. 设置Relay连接(如果使用)
  7. 订阅房间事件(SubscribeToJoinedLobbyAsync)

3.2 房间加入流程

  1. 用户通过UI请求加入房间(LobbyUIMediator.JoinLobbyRequest)
  2. 验证用户身份
  3. 调用LobbyServiceFacade.TryJoinLobbyAsync加入房间
  4. 设置本地房间状态
  5. 启动客户端连接(ConnectionManager.StartClientLobby)
  6. 设置Relay连接(如果使用)
  7. 订阅房间事件

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. 前提条件

  1. 安装 Unity Services 包:在 Unity 编辑器中,打开 “Window” -> “Package Manager”,搜索 “Unity Services” 并安装相关包,确保Unity.Services.Lobbies包已安装。
  2. 初始化 Unity Services:在项目启动时,初始化 Unity Services。可以在MonoBehaviourStart方法中添加以下代码:
usingUnityEngine;usingUnityEngine.Services.Core;publicclassUnityServicesInitializer:MonoBehaviour{asyncvoidStart(){awaitUnityServices.InitializeAsync();// 初始化完成后可以进行其他操作,如登录等}}

2. 创建大厅

  1. 导入必要命名空间:在脚本顶部添加using Unity.Services.Lobbies;using Unity.Services.Lobbies.Models;
  2. 创建大厅函数
usingUnityEngine;usingUnityEngine.UI;usingUnity.Services.Lobbies;usingUnity.Services.Lobbies.Models;usingSystem.Threading.Tasks;publicclassLobbyCreator:MonoBehaviour{publicintmaxPlayers=4;publicstringlobbyName="My Lobby";publicButtoncreateButton;asyncvoid
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/13 12:14:14

OpenUSD工具链:从入门到精通的实用指南

OpenUSD工具链:从入门到精通的实用指南 【免费下载链接】OpenUSD Universal Scene Description 项目地址: https://gitcode.com/GitHub_Trending/ope/OpenUSD OpenUSD工具链作为Universal Scene Description生态系统的重要组成部分,为开发者提供了…

作者头像 李华
网站建设 2026/3/21 0:54:32

2025终极Valetudo兼容指南:50+款扫地机器人完全解析

2025终极Valetudo兼容指南:50款扫地机器人完全解析 【免费下载链接】Valetudo Cloud replacement for vacuum robots enabling local-only operation 项目地址: https://gitcode.com/gh_mirrors/va/Valetudo 在智能家居蓬勃发展的今天,云端依赖已…

作者头像 李华
网站建设 2026/3/21 0:54:27

Orleans分布式追踪方案深度对比:Jaeger vs Zipkin实战指南

Orleans分布式追踪方案深度对比:Jaeger vs Zipkin实战指南 【免费下载链接】orleans dotnet/orleans: Orleans是由微软研究团队创建的面向云应用和服务的分布式计算框架,特别适合构建虚拟 actor模型的服务端应用。Orleans通过管理actors生命周期和透明地…

作者头像 李华
网站建设 2026/3/20 19:39:42

运维工程师技术教程之ELK日志监控

ELK(现在通常称为 Elastic Stack,加入 Beats 后扩展为 ELKB)在运维工作中使用非常广泛,是企业级日志管理、监控告警、故障排查的主流开源解决方案,尤其是在中大型互联网公司、云原生架构、分布式系统的运维场景中&…

作者头像 李华
网站建设 2026/3/20 19:39:40

Cocos事件优先级深度解析:从交互冲突到精准控制的完整指南

Cocos事件优先级深度解析:从交互冲突到精准控制的完整指南 【免费下载链接】cocos-engine Cocos simplifies game creation and distribution with Cocos Creator, a free, open-source, cross-platform game engine. Empowering millions of developers to create …

作者头像 李华