Netcode for GameObjects Boss Room 多人RPG战斗(81)
OfflineState.cs是Unity Multiplayer示例项目中网络连接状态机的基础状态类,负责管理客户端处于离线状态时的所有逻辑。该类继承自ConnectionState,是状态机的起始和终止状态,处理从离线到在线的状态转换。
OfflineState.cs
1. 概述
OfflineState.cs是Unity Multiplayer示例项目中网络连接状态机的基础状态类,负责管理客户端处于离线状态时的所有逻辑。该类继承自ConnectionState,是状态机的起始和终止状态,处理从离线到在线的状态转换。
2. 继承关系
ConnectionState (抽象基类)
↓
OfflineState (具体实现,管理离线状态)
3. 核心功能
3.1 状态进入处理
- Enter() 方法:
- 结束Lobby服务跟踪
- 关闭NetworkManager,确保网络系统完全关闭
- 如果当前不在主菜单场景,加载主菜单场景(使用普通SceneManager而非NetworkSceneManager)
3.2 客户端启动功能
-
StartClientIP(string playerName, string ipaddress, int port):
- 创建IP连接方式(ConnectionMethodIP)
- 配置重连状态(m_ClientReconnecting)
- 转换到客户端连接状态(m_ClientConnecting)
-
StartClientLobby(string playerName):
- 创建Relay连接方式(ConnectionMethodRelay)
- 配置重连状态
- 转换到客户端连接状态
3.3 主机启动功能
-
StartHostIP(string playerName, string ipaddress, int port):
- 创建IP连接方式
- 转换到主机启动状态(m_StartingHost)
-
StartHostLobby(string playerName):
- 创建Relay连接方式
- 转换到主机启动状态
4. 依赖与集成
4.1 依赖注入(VContainer)
- LobbyServiceFacade:管理Unity Lobby服务
- ProfileManager:管理玩家配置文件和信息
- LocalLobby:管理本地Lobby数据
4.2 核心系统集成
- ConnectionManager:提供状态机核心功能和状态转换
- NetworkManager:处理底层网络连接管理
- SceneLoaderWrapper:处理场景加载
- ConnectionMethod:定义不同的连接方式(IP/Relay)
5. 设计优势
5.1 状态模式应用
- 作为状态机的基础状态,实现了统一的状态接口
- 封装了离线状态下的所有逻辑,提高代码可读性和可维护性
5.2 连接方式灵活性
- 支持两种连接方式:直接IP连接和Lobby Relay连接
- 通过ConnectionMethod抽象,便于扩展更多连接方式
5.3 场景管理
- 确保离线状态下始终回到主菜单场景
- 使用场景名称常量,提高代码可维护性
5.4 重连准备
- 在启动客户端连接时预先配置重连状态
- 确保在连接失败时可以无缝切换到重连状态
6. 代码优化建议
6.1 命名空间修复
当前命名空间存在拼写错误:
namespace UUnity.BossRoom.ConnectionManagement
应修改为:
namespace Unity.BossRoom.ConnectionManagement
6.2 Exit() 方法实现
当前Exit()方法为空实现,考虑添加适当的清理逻辑:
public override void Exit()
{
// 可以添加状态退出时的清理逻辑
Debug.Log("Exiting OfflineState");
}
6.3 参数验证
在启动连接方法中添加参数验证,提高代码健壮性:
public override void StartClientIP(string playerName, string ipaddress, int port)
{
if (string.IsNullOrEmpty(playerName) || string.IsNullOrEmpty(ipaddress))
{
Debug.LogError("Invalid parameters for StartClientIP");
return;
}
// 现有逻辑...
}
6.4 连接方式工厂
考虑使用工厂模式创建ConnectionMethod实例,减少重复代码:
private ConnectionMethod CreateConnectionMethodIP(string ipaddress, ushort port, string playerName)
{
return new ConnectionMethodIP(ipaddress, port, m_ConnectionManager, m_ProfileManager, playerName);
}
7. 应用场景与工作流程
7.1 典型工作流程
- 游戏启动时,初始状态为OfflineState
- 玩家在主菜单选择连接方式(IP或Lobby)
- 根据选择调用相应的StartClient或StartHost方法
- 转换到相应的连接状态(ClientConnecting或StartingHost)
- 当连接断开或用户退出时,转换回OfflineState
7.2 状态转换图
OfflineState
↑ ↓
| |
| |
| |
ClientDisconnected StartClient* / StartHost*
| |
| |
| |
↓ ↓
其他状态 ClientConnecting / StartingHost
OfflineState.cs作为网络连接状态机的基础状态,提供了从离线到在线的所有入口点,是整个连接系统的核心组件之一。它的设计体现了状态模式的优势,通过统一的接口管理不同的连接方式和状态转换,使代码结构清晰、易于维护和扩展。
这里是一个专注于游戏开发的社区,我们致力于为广大游戏爱好者提供一个良好的学习和交流平台。我们的专区包含了各大流行引擎的技术博文,涵盖了从入门到进阶的各个阶段,无论你是初学者还是资深开发者,都能在这里找到适合自己的内容。除此之外,我们还会不定期举办游戏开发相关的活动,让大家更好地交流互动。加入我们,一起探索游戏开发的奥秘吧!
更多推荐


所有评论(0)