网络会话模块 private

网络会话模块

目标

Login 返回 Lobby 地址和 SessionId,Lobby 分配 Battle 地址与 battleId,客户端由 NetworkManager 统一创建连接、分发消息、关闭和重连。

会话模型

Login(ip:port) --OnEnterLobby--> Lobby(ip:port, sessionId)
Lobby --battleId/playerId--> Battle(ip:port, battleId, playerId)

源码:Assets/Code/Game/Network/NetworkManager.cs、Assets/Code/Game/Network/ServerCfg.cs。

关键实现

public async UniTask<LoginClient> CheckSessionLogin(string ip, ushort port,
    bool refreshAccount = false)
{
    _loginClient = new LoginClient(_logger);
    _loginClient.OnEnterLobby += OnEnterLobby;
    _loginClient.OnReceivedPacket += PublishLoginMessage;
    return await _loginClient.Connect(ip, port, refreshAccount)
        ? _loginClient : null;
}

public void OnEnterLobby(string ip, ushort port, string sessionId)
{
    CloseSessionLogin();
    CloseSessionLobby();
    _CacheSessionId = sessionId;
    _CacheLobbyIp = ip;
    _CacheLobbyPort = port;
    _lobbyClient = new LobbyClient(_logger, sessionId);
    _lobbyClient.OnReceivedPacket += PublishLobbyMessage;
    _lobbyClient.Connect(ip, port);
}

public void CreateSessionBattle(string ip, ushort port, string battleId,
    int playerid, INetPacketCompressor compressor)
{
    _battleClient?.Dispose();
    _battleClient = new BattleClient(_logger, battleId, playerid,
        m_dataInGame, compressor);
    _battleClient.OnReceivedPacket += PublishMessageInGame;
    _battleClient.Connect(ip, port);
}

改成本地服务器

ServerInfo.Ip/Port 是入口,ServerCfg.CurServer 是当前选择。不要把地址硬编码进 NetworkManager,应修改开发环境的 ServerCfg/生成配置:

Login:  127.0.0.1:7001
Lobby:  127.0.0.1:7002  (由 Login OnEnterLobby 返回)
Battle: 127.0.0.1:7100  (由 Lobby 房间分配)

重连和验收

  • Lobby 保留缓存的 SessionId、IP、端口,可调用 ForceReConnectLobby。
  • Battle 使用 ForceReConnectBattle,不要复用已 Dispose 对象。
  • 切换网络先调用 ResetLobbyParam/ResetBattleParam。
  • 依次验证登录、进大厅、创建房间、进战区、断开 Lobby、重连。