using System.Collections; using System.Collections.Generic; using UnityEngine; using System; public class ConnectedState : NetState { const int OVERTIME_THRESHOLD = 20; bool connectedDetecting = false; NetworkReachability m_NetWorkReachability = NetworkReachability.ReachableViaCarrierDataNetwork; NetworkReachability netWorkReachability { get { return m_NetWorkReachability; } set { if (m_NetWorkReachability != value) { m_NetWorkReachability = value; DetectConnected(3); } } } public override void OnEnter() { base.OnEnter(); m_NetWorkReachability = Application.internetReachability; // NetLinkWin.Hide(); } protected override void Update() { if (GameNetSystem.Instance.netState != GameNetSystem.NetState.Connected) { return; } if (connectedDetecting) { return; } if (GameNetSystem.Instance.timeSinceMainSocketLastProtocol > OVERTIME_THRESHOLD || (GameNetSystem.Instance.crossServerConnected_Loigc && GameNetSystem.Instance.timeSinceCrossServerSocketLastProtocol > OVERTIME_THRESHOLD)) { DetectConnected(3); } else if (!GameNetSystem.Instance.mainSocketConnected || (GameNetSystem.Instance.crossServerConnected_Loigc && !GameNetSystem.Instance.crossServerSocketConnected)) { DetectConnected(3); } else { #if UNITY_IOS && !UNITY_EDITOR netWorkReachability = Application.internetReachability; #endif } } Clock clock; public override void OnExit() { if (clock != null) { Clock.Stop(clock); } clock = null; base.OnExit(); } private void DetectConnected(int _seconds) { connectedDetecting = true; // var sendInfo1 = new C0104_tagCOnlineReturn(); // sendInfo1.Type = 0; // GameNetSystem.Instance.SendInfo(sendInfo1);// 在线回应 // if (GameNetSystem.Instance.crossServerConnected_Loigc) // { // var sendInfo2 = new C0104_tagCOnlineReturn(); // sendInfo2.Type = 0; // GameNetSystem.Instance.SendToCrossServer(sendInfo2);// 在线回应 // } // if (clock != null) // { // Clock.Stop(clock); // } // clock = Clock.AlarmAt(DateTime.Now + new TimeSpan(_seconds * TimeSpan.TicksPerSecond), OnDetectEnd); } private void OnDetectEnd() { connectedDetecting = false; var isDisconnected = false; #if UNITY_IOS && !UNITY_EDITOR isDisconnected = GameNetSystem.Instance.timeSinceMainSocketLastProtocol > 3f; #else isDisconnected = !GameNetSystem.Instance.mainSocketConnected || GameNetSystem.Instance.timeSinceMainSocketLastProtocol > OVERTIME_THRESHOLD; #endif if (GameNetSystem.Instance.crossServerConnected_Loigc) { #if UNITY_IOS && !UNITY_EDITOR isDisconnected = isDisconnected || GameNetSystem.Instance.timeSinceCrossServerSocketLastProtocol > 3f; #else isDisconnected = isDisconnected || !GameNetSystem.Instance.crossServerSocketConnected || GameNetSystem.Instance.timeSinceCrossServerSocketLastProtocol > OVERTIME_THRESHOLD; #endif } if (isDisconnected) { switch (Application.internetReachability) { case NetworkReachability.NotReachable: GameNetSystem.Instance.Disconnect(); // WindowCenter.Instance.Open(); break; case NetworkReachability.ReachableViaCarrierDataNetwork: case NetworkReachability.ReachableViaLocalAreaNetwork: GameNetSystem.Instance.Reconnect(); break; } } } private void OnApplicationPause(bool pause) { if (GameNetSystem.Instance.netState != GameNetSystem.NetState.Connected) { return; } if (!pause) { DetectConnected(3); } } }