news 2026/5/30 17:46:03

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/5/24 3:43:08

21、邮件配置中的重写规则与特殊 m4 配置详解

邮件配置中的重写规则与特殊 m4 配置详解 1. 重写规则理解 重写规则在邮件处理中起着核心作用,它主要用于匹配输入地址并根据特定模式进行重写。下面通过几个测试来详细说明其工作原理。 1.1 模板键值测试 模板使用 @ 加上 $2 的值作为键。例如,当键为 @imaginary.c…

作者头像 李华
网站建设 2026/5/26 22:38:53

多线程相关面试题-线程安全相关问题-锁相关问题

问题 1:什么是进程?什么是线程?二者的核心区别是什么? 问题 2:Java 中创建线程的三种方式是什么?分别举例说明。问题 3:start () 方法和 run () 方法的区别是什么?问题 4&#xff1a…

作者头像 李华
网站建设 2026/5/28 12:18:36

在亚马逊云上解决RDS、MariaDB 与 Aurora MySQL复制延迟实战指南

在高吞吐量的数据库系统中,复制延迟(Replica Lag)一直是个棘手的难题。在 MySQL 生态圈内,传统的异步复制架构由于其单线程应用事务的性能瓶颈,严重限制了从库(Replica)的处理能力 (1)。特别是在…

作者头像 李华
网站建设 2026/5/29 13:10:43

Java八股文合集来了,彻底解决一线大厂面试难题

纵观今年的技术招聘市场, Java 依旧是当仁不让的霸主 !即便遭受 Go 等新兴语言不断冲击,依旧岿然不动。究其原因: Java 有着极其成熟的生态,这个不用我多说;Java 在 运维、可观测性、可监 控性方面都有着非…

作者头像 李华
网站建设 2026/5/29 5:47:48

5个实用技巧:轻松在Vim中查看文件属性

5个实用技巧:轻松在Vim中查看文件属性 【免费下载链接】vim-galore :mortar_board: All things Vim! 项目地址: https://gitcode.com/gh_mirrors/vi/vim-galore 作为一名Vim用户,你是否曾经需要快速了解文件的修改时间、大小或权限信息&#xff1f…

作者头像 李华
网站建设 2026/5/28 2:11:24

Unity网络请求终极指南:RestClient快速上手与实战技巧

在Unity开发中,处理网络请求是每个开发者都会遇到的挑战。传统的UnityWebRequest虽然功能强大,但代码结构往往复杂冗长。RestClient for Unity应运而生,这款基于Promise的REST和HTTP客户端彻底改变了Unity异步编程的游戏规则,让HT…

作者头像 李华