This commit is contained in:
2026-08-04 18:17:09 +08:00
parent db93954abd
commit 3359483dfe
2 changed files with 97 additions and 63 deletions
@@ -818,6 +818,7 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
/// <summary>
/// 离房卸载流程:进度条到 0.9 后等待 socket 响应,
/// 收到信号后走到 1.0 并切回 home 界面。
/// ⭐ 用 try-finally 保证无论中间是否异常,最终一定会关闭 GamePanel 并切回 Home
/// </summary>
private async void BeginLeaveRoomUnload()
{
@@ -827,64 +828,91 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
return;
}
JinDuTiao.Show();
JinDuTiao.SetProgress(0.2f);
await FishResourcesData.UnLoadFishAssetsData();
JinDuTiao.SetProgress(0.4f);
await AudioResourcesData.UnLoadAudioGame();
JinDuTiao.SetProgress(0.6f);
await MonsterMoveLine.UnLoadBezier();
JinDuTiao.SetProgress(0.8f);
await Task.Delay(100);
CreateFishManager.Instance.ExitRoom();
CreateFishManager.Instance.isResources = false;
// ⭐ 清空子弹池 + 特效池(鱼池已在 UnLoadFishAssetsData 内清理)
BulletPool.Instance.ClearAll();
EffectPool.Instance.ClearAll();
JinDuTiao.SetProgress(0.9f);
// ⭐ 卡在 0.9 等待 socket 返回 LeaveRoomResult
// - socket 已早返回(比卸载快) → 在 0.9 再等 1 秒(美观)后变 1
// - socket 未返回 → 等待 socket,最多 10 秒,超时强制变 1 退出
if (_leaveRoomResponseTcs != null)
try
{
bool alreadyReceived = _leaveRoomResponseTcs.Task.IsCompleted;
if (alreadyReceived)
if (JinDuTiao != null) JinDuTiao.Show();
if (JinDuTiao != null) JinDuTiao.SetProgress(0.2f);
await FishResourcesData.UnLoadFishAssetsData();
if (JinDuTiao != null) JinDuTiao.SetProgress(0.4f);
await AudioResourcesData.UnLoadAudioGame();
if (JinDuTiao != null) JinDuTiao.SetProgress(0.6f);
await MonsterMoveLine.UnLoadBezier();
if (JinDuTiao != null) JinDuTiao.SetProgress(0.8f);
await Task.Delay(100);
CreateFishManager.Instance.ExitRoom();
CreateFishManager.Instance.isResources = false;
// ⭐ 清空子弹池 + 特效池(鱼池已在 UnLoadFishAssetsData 内清理)
BulletPool.Instance.ClearAll();
EffectPool.Instance.ClearAll();
if (JinDuTiao != null) JinDuTiao.SetProgress(0.9f);
// ⭐ 卡在 0.9 等待 socket 返回 LeaveRoomResult
// - socket 已早返回(比卸载快) → 在 0.9 再等 1 秒(美观)后变 1
// - socket 未返回 → 等待 socket,最多 10 秒,超时强制变 1 退出
if (_leaveRoomResponseTcs != null)
{
// socket 比卸载早返回 → 0.9 停留 1 秒
await Task.Delay(1000);
}
else
{
// socket 未返回 → 等待,最多 10 秒
var timeoutTask = Task.Delay(10000);
var done = await Task.WhenAny(_leaveRoomResponseTcs.Task, timeoutTask);
if (done == timeoutTask)
bool alreadyReceived = _leaveRoomResponseTcs.Task.IsCompleted;
if (alreadyReceived)
{
// 超时 10 秒 → 强制退出,不管结算是否返回
#if UNITY_EDITOR
Debug.LogWarning("[LeaveRoom] 等待 socket 超时 10 秒,强制退出");
#endif
// socket 比卸载早返回 → 0.9 停留 1 秒
await Task.Delay(1000);
}
else
{
// socket 未返回 → 等待,最多 10 秒
var timeoutTask = Task.Delay(10000);
var done = await Task.WhenAny(_leaveRoomResponseTcs.Task, timeoutTask);
if (done == timeoutTask)
{
// 超时 10 秒 → 强制退出,必须执行和 ExitFishingGame 一致的清理
// 否则 game socket 不关闭、isGame 不复位,导致无法再次进入游戏
Debug.LogWarning("[LeaveRoom] 等待 socket 超时 10 秒,强制退出并清理游戏状态");
try
{
WebSocketManager.Instance.isGame = false;
GameManager.LogGoldFlow("ExitRoom", $"超时强制退出 房间={GameManager.Instance.gameData?.currRoomData?.roomId}");
WebSocketManager.Instance.Close(SocketType.game);
APIRequestList.GetUser((user) =>
{
GameManager.Instance.UpdataUserData(user);
});
}
catch (Exception cleanEx)
{
Debug.LogError($"[LeaveRoom] 超时清理异常: {cleanEx}");
}
}
}
}
// 标记已卸载,OnHide 跳过重复卸载
_resourcesUnloaded = true;
if (JinDuTiao != null) JinDuTiao.SetProgress(1);
await Task.Delay(300);
if (JinDuTiao != null) JinDuTiao.Hide();
}
catch (Exception ex)
{
Debug.LogError($"[LeaveRoom] 卸载流程异常: {ex}");
}
finally
{
// ⭐ 无论中间是否异常,都必须关闭 GamePanel 并切回 Home
// 否则 GamePanel 留在 panels 字典里,下次进入游戏时 Get 返回非 null 导致无法创建新面板
_leaveRoomResponseTcs = null;
if (JinDuTiao != null)
{
try { JinDuTiao.Hide(); } catch { }
}
// 进入 home 界面(关闭当前游戏面板)
UIManager.Instance.ShowAsync(UIPanel.HomeMainPanel, _leavingGamePanelType);
}
// 标记已卸载,OnHide 跳过重复卸载
_resourcesUnloaded = true;
JinDuTiao.SetProgress(1);
await Task.Delay(300);
JinDuTiao.Hide();
// 进入 home 界面(关闭当前游戏面板)
UIManager.Instance.ShowAsync(UIPanel.HomeMainPanel, _leavingGamePanelType);
_leaveRoomResponseTcs = null;
}
/// <summary>