This commit is contained in:
2026-07-13 00:12:44 +08:00
parent 05bc1e286b
commit ffcdfa3b77
11 changed files with 441 additions and 17 deletions
@@ -12,6 +12,8 @@ namespace Assets.MyGame.Scripts.Net
{
public class WebSocketReponseList
{
/// <summary>正在加载中的游戏场景 UIPanel 集合,防止房主收到多条 RoomJoinNotice(含人机)时重复创建场景</summary>
private static readonly HashSet<UIPanel> _loadingGamePanels = new HashSet<UIPanel>();
/// <summary>
/// 获取房间列表 room
/// </summary>
@@ -94,23 +96,34 @@ namespace Assets.MyGame.Scripts.Net
default:
break;
}
if (UIManager.Instance.Get<GameMainPanel_Base>(uIPanel)==null)
if (UIManager.Instance.Get<GameMainPanel_Base>(uIPanel)==null && !_loadingGamePanels.Contains(uIPanel))
{
UIManager.Instance.ShowAsync(uIPanel, UIPanel.HomeMainPanel, msg);
// 卸载所有已加载的游戏地图场景
// 标记正在加载,防止房主收到多条 RoomJoinNotice(含人机玩家)时重复创建场景
_loadingGamePanels.Add(uIPanel);
UIManager.Instance.ShowAsync(uIPanel, UIPanel.HomeMainPanel, msg, (panel) =>
{
// 面板创建完成,移除加载标记
_loadingGamePanels.Remove(uIPanel);
});
// 卸载所有已加载的游戏地图场景(保证场景唯一性)
string[] gameScenes = { "FLZY", "YYSC", "XJMH", "HHWK" };
foreach (var sn in gameScenes)
{
// 不卸载即将加载的目标场景
if (sn == sceneName) continue;
var s = SceneManager.GetSceneByName(sn);
if (s.IsValid() && s.isLoaded)
SceneManager.UnloadSceneAsync(sn);
}
SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);
// 目标场景已加载则不重复加载
var targetScene = SceneManager.GetSceneByName(sceneName);
if (!targetScene.IsValid() || !targetScene.isLoaded)
SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);
UIManager.Instance.Close(UIPanel.HomeMainPanel);
WebSocketManager.Instance.isGame = true;
}
else
else if (UIManager.Instance.Get<GameMainPanel_Base>(uIPanel) != null)
{
// 面板已存在 → 新玩家加入,转发给现有面板激活座位
var panel = UIManager.Instance.Get<GameMainPanel_Base>(uIPanel);
@@ -134,6 +147,7 @@ namespace Assets.MyGame.Scripts.Net
}
}
}
// else: 场景正在加载中(_loadingGamePanels 含此 uIPanel),忽略本次重复通知
}