using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using vnxbqy.UI; public class CreateOrSelectRoleState : NetState { const int OVERTIME_THRESHOLD = 12; 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() { m_NetWorkReachability = Application.internetReachability; NetLinkWin.Hide(); base.OnEnter(); } protected override void Update() { if (GameNetSystem.Instance.netState != GameNetSystem.NetState.CreateOrSelectRole) { 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 } } public override void OnExit() { if (clock != null) { Clock.Stop(clock); } clock = null; base.OnExit(); } Clock clock; private void DetectConnected(int _seconds) { connectedDetecting = true; var sendInfo = new C0104_tagCOnlineReturn(); sendInfo.Type = 0; GameNetSystem.Instance.SendInfo(sendInfo);// 在线回应 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(); 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.CreateOrSelectRole) { return; } if (!pause) { DetectConnected(3); } } }