migration

This commit is contained in:
2026-07-26 12:31:59 +05:30
parent 4b2129b944
commit c2f4c2f808
12 changed files with 1818 additions and 981 deletions
+25 -4
View File
@@ -162,7 +162,10 @@ public class NetManager : NetworkManager
{
base.OnClientDisconnect();
Logger.Log("Client disconnected");
if (ShouldReconnect())
// Mirror raises OnDisconnectedEvent before clearing ConnectState, so
// NetworkClient.isConnected is still true here on involuntary drops.
// Gate on policy flags only; teardown wait happens in the reconnect loop.
if (CanAttemptReconnect())
{
if (reconnectCoroutine == null)
reconnectCoroutine = StartCoroutine(ReconnectLoopCoroutine());
@@ -206,6 +209,12 @@ public class NetManager : NetworkManager
SetReconnectCanvasVisible(true);
reopenRequestedThisDisconnect = false;
reopenRequestInFlight = false;
// Wait until Mirror finishes OnClientDisconnectInternal (clears Connected
// then Shutdown). Without this, ShouldReconnect() fails immediately.
while (NetworkClient.isConnected || NetworkClient.active)
yield return null;
float reconnectStartedAt = Time.realtimeSinceStartup;
float initialWaitEnd = Time.realtimeSinceStartup + InitialReconnectDelaySeconds;
while (ShouldReconnect() && Time.realtimeSinceStartup < initialWaitEnd)
@@ -242,20 +251,32 @@ public class NetManager : NetworkManager
SetReconnectCanvasVisible(false);
}
bool ShouldReconnect()
/// <summary>
/// Policy checks that are safe during Mirror's disconnect callback
/// (when <see cref="NetworkClient.isConnected"/> may still be true).
/// </summary>
bool CanAttemptReconnect()
{
if (s_IntentionalClientDisconnect)
return false;
if (NetworkServer.active)
return false;
if (NetworkClient.isConnected)
return false;
if (GameManager.instance != null && GameManager.instance.isGameEnded)
return false;
return true;
}
bool ShouldReconnect()
{
if (!CanAttemptReconnect())
return false;
if (NetworkClient.isConnected)
return false;
return true;
}
IEnumerator CoRequestReopenForCurrentPort()
{
reopenRequestInFlight = true;