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 典型工作流程

  1. 游戏启动时,初始状态为OfflineState
  2. 玩家在主菜单选择连接方式(IP或Lobby)
  3. 根据选择调用相应的StartClient或StartHost方法
  4. 转换到相应的连接状态(ClientConnecting或StartingHost)
  5. 当连接断开或用户退出时,转换回OfflineState

7.2 状态转换图

OfflineState
    ↑                  ↓
    |                  |
    |                  |
    |                  |
ClientDisconnected   StartClient* / StartHost*
    |                  |
    |                  |
    |                  |
    ↓                  ↓
其他状态           ClientConnecting / StartingHost

OfflineState.cs作为网络连接状态机的基础状态,提供了从离线到在线的所有入口点,是整个连接系统的核心组件之一。它的设计体现了状态模式的优势,通过统一的接口管理不同的连接方式和状态转换,使代码结构清晰、易于维护和扩展。

Logo

这里是一个专注于游戏开发的社区,我们致力于为广大游戏爱好者提供一个良好的学习和交流平台。我们的专区包含了各大流行引擎的技术博文,涵盖了从入门到进阶的各个阶段,无论你是初学者还是资深开发者,都能在这里找到适合自己的内容。除此之外,我们还会不定期举办游戏开发相关的活动,让大家更好地交流互动。加入我们,一起探索游戏开发的奥秘吧!

更多推荐