| 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) | 
|         { | 
|             DetectConnected(3); | 
|         } | 
|         else if (!GameNetSystem.Instance.mainSocketConnected) | 
|         { | 
|             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 (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 (isDisconnected) | 
|         { | 
|             switch (Application.internetReachability) | 
|             { | 
|                 case NetworkReachability.NotReachable: | 
|                     GameNetSystem.Instance.Disconnect(); | 
|                     UIManager.Instance.OpenWindow<DisconnectHintWin>(); | 
|                     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); | 
|         } | 
|     } | 
|   | 
| } |