网络会话模块 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、重连。