using UnityEngine; using System; using System.Collections; using System.Collections.Generic; using Snxxz.UI; public class GameNetSystem : Singleton { NetUpdateBehaviour m_NetUpdateBehaviour; NeverConnectState neverConnectState; AccountLoginState accountLoginState; CreateOrSelectRoleState createOrSelectRoleState; RoleLoginState roleLoginState; ConnectedState connectedState; DisconnectState disconnectState; NetState m_NetState; public NetState netState { get { return this.m_NetState; } set { if (this.m_NetState != value) { switch (m_NetState) { case NetState.NerverConnect: neverConnectState.OnExit(); break; case NetState.AccountLogin: accountLoginState.OnExit(); break; case NetState.CreateOrSelectRole: createOrSelectRoleState.OnExit(); break; case NetState.RoleLogin: roleLoginState.OnExit(); break; case NetState.Connected: connectedState.OnExit(); break; case NetState.DisConnected: disconnectState.OnExit(); break; } this.m_NetState = value; switch (m_NetState) { case NetState.NerverConnect: neverConnectState.OnEnter(); break; case NetState.AccountLogin: accountLoginState.OnEnter(); break; case NetState.CreateOrSelectRole: createOrSelectRoleState.OnEnter(); break; case NetState.RoleLogin: roleLoginState.OnEnter(); break; case NetState.Connected: connectedState.OnEnter(); break; case NetState.DisConnected: disconnectState.OnEnter(); break; } } } } private ClientSocketController socketController; public bool socketConnected { get { return socketController == null ? false : socketController.Connected; } } Queue packQueue = new Queue(); DateTime m_LastPackageTime; public DateTime lastPackageTime { get { return m_LastPackageTime; } } Action onConnected; public event Action disconnectEvent; public event Action connectedEvent; public GameNetSystem() { var gameObject = new GameObject("NetUpdateBehaviour"); GameObject.DontDestroyOnLoad(gameObject); m_NetUpdateBehaviour = gameObject.AddComponent(); m_NetUpdateBehaviour.RegisterUpdateCallBack(OnUpdate); neverConnectState = gameObject.AddComponent(); accountLoginState = gameObject.AddComponent(); createOrSelectRoleState = gameObject.AddComponent(); roleLoginState = gameObject.AddComponent(); connectedState = gameObject.AddComponent(); disconnectState = gameObject.AddComponent(); netState = NetState.NerverConnect; } public void BeginConnectGameServer(string _ip, int _port, Action _onConnected) { try { if (socketController != null && socketController.Connected) { socketController.CloseConnect(); } } catch (System.Exception ex) { DebugEx.Log(ex); } socketController = new ClientSocketController(); GameNetEncode.ResetEncodeIndex(); lock (packQueue) { packQueue.Clear(); } onConnected = _onConnected; socketController.Connect(_ip, _port, OnSocketConnected); } public void SendInfo(GameNetPackBasic vNetPack) { if (socketController != null) { socketController.SendInfo(vNetPack); DebugPkgCache.Push(vNetPack); } } public void SendInfo(byte[] vBytes) { if (socketController != null) { socketController.SendInfo(vBytes); } } public void PushPackage(GameNetPackBasic _package) { if (_package == null) { return; } m_LastPackageTime = DateTime.Now; lock (packQueue) { lock (_package) { if (PackageRegedit.Contain(_package.cmd)) { packQueue.Enqueue(_package); DebugPkgCache.Push(_package); } else { DebugEx.LogWarningFormat("数据包(cmd:{0})未登记!", _package.cmd); } } } } public void Disconnect() { try { if (socketController != null) { socketController.CloseConnect(); } GameNetEncode.ResetEncodeIndex(); lock (packQueue) { packQueue.Clear(); } } catch (Exception ex) { Debug.Log(ex); } finally { netState = NetState.DisConnected; } } public void Reconnect() { try { if (socketController != null) { socketController.CloseConnect(); } GameNetEncode.ResetEncodeIndex(); lock (packQueue) { packQueue.Clear(); } } catch (Exception ex) { Debug.Log(ex); } finally { netState = NetState.AccountLogin; var loginModel = ModelCenter.Instance.GetModel(); loginModel.busy = false; loginModel.ReAccountLogin(); } } public void LoginOut() { try { if (socketController != null) { socketController.CloseConnect(); } GameNetEncode.ResetEncodeIndex(); lock (packQueue) { packQueue.Clear(); } } catch (Exception ex) { Debug.Log(ex); } finally { netState = NetState.NerverConnect; var loginModel = ModelCenter.Instance.GetModel(); loginModel.busy = false; WindowJumpMgr.Instance.ClearJumpData(); StageManager.Instance.LoadLoginStage(); NetLinkWin.Hide(); } } public void OnAccountLogin() { netState = NetState.AccountLogin; } public void OnEnterWorld() { netState = NetState.RoleLogin; } void OnUpdate() { lock (packQueue) { if (packQueue != null) { while (packQueue.Count > 0) { PackageRegedit.Distribute(packQueue.Dequeue()); } } } } private void OnSocketConnected() { m_LastPackageTime = DateTime.Now; if (onConnected != null) { onConnected(); onConnected = null; } } public enum NetState { NerverConnect = 1, AccountLogin = 2, CreateOrSelectRole = 3, RoleLogin = 4, Connected = 5, DisConnected = 6, } }