using UnityEngine;
|
using System;
|
using System.Collections;
|
using System.Collections.Generic;
|
using Snxxz.UI;
|
|
[XLua.LuaCallCSharp]
|
public class GameNetSystem : Singleton<GameNetSystem>
|
{
|
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<GameNetPackBasic> packQueue = new Queue<GameNetPackBasic>();
|
|
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<NetUpdateBehaviour>();
|
m_NetUpdateBehaviour.RegisterUpdateCallBack(OnUpdate);
|
|
neverConnectState = gameObject.AddComponent<NeverConnectState>();
|
accountLoginState = gameObject.AddComponent<AccountLoginState>();
|
createOrSelectRoleState = gameObject.AddComponent<CreateOrSelectRoleState>();
|
roleLoginState = gameObject.AddComponent<RoleLoginState>();
|
connectedState = gameObject.AddComponent<ConnectedState>();
|
disconnectState = gameObject.AddComponent<DisconnectState>();
|
|
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>();
|
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>();
|
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,
|
}
|
|
}
|