1
This commit is contained in:
@@ -12,8 +12,15 @@ namespace Assets.MyGame.Scripts.Net
|
||||
{
|
||||
public class WebSocketReponseList
|
||||
{
|
||||
/// <summary>正在加载中的游戏场景 UIPanel 集合,防止房主收到多条 RoomJoinNotice(含人机)时重复创建场景</summary>
|
||||
private static readonly HashSet<UIPanel> _loadingGamePanels = new HashSet<UIPanel>();
|
||||
/// <summary>已加载(或正在加载)的游戏场景名集合,防止人机 RoomJoinNotice 触发重复 LoadSceneAsync</summary>
|
||||
private static readonly HashSet<string> _loadedGameScenes = new HashSet<string>();
|
||||
|
||||
/// <summary>清除指定场景的加载标记(退出游戏时调用,下次进入可重新加载)</summary>
|
||||
public static void ClearLoadedGameScene(string sceneName)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(sceneName))
|
||||
_loadedGameScenes.Remove(sceneName);
|
||||
}
|
||||
/// <summary>
|
||||
/// 获取房间列表 room
|
||||
/// </summary>
|
||||
@@ -96,15 +103,9 @@ namespace Assets.MyGame.Scripts.Net
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (UIManager.Instance.Get<GameMainPanel_Base>(uIPanel)==null && !_loadingGamePanels.Contains(uIPanel))
|
||||
if (UIManager.Instance.Get<GameMainPanel_Base>(uIPanel)==null)
|
||||
{
|
||||
// 标记正在加载,防止房主收到多条 RoomJoinNotice(含人机玩家)时重复创建场景
|
||||
_loadingGamePanels.Add(uIPanel);
|
||||
UIManager.Instance.ShowAsync(uIPanel, UIPanel.HomeMainPanel, msg, (panel) =>
|
||||
{
|
||||
// 面板创建完成,移除加载标记
|
||||
_loadingGamePanels.Remove(uIPanel);
|
||||
});
|
||||
UIManager.Instance.ShowAsync(uIPanel, UIPanel.HomeMainPanel, msg);
|
||||
// 卸载所有已加载的游戏地图场景(保证场景唯一性)
|
||||
string[] gameScenes = { "FLZY", "YYSC", "XJMH", "HHWK" };
|
||||
foreach (var sn in gameScenes)
|
||||
@@ -113,17 +114,24 @@ namespace Assets.MyGame.Scripts.Net
|
||||
if (sn == sceneName) continue;
|
||||
var s = SceneManager.GetSceneByName(sn);
|
||||
if (s.IsValid() && s.isLoaded)
|
||||
{
|
||||
SceneManager.UnloadSceneAsync(sn);
|
||||
_loadedGameScenes.Remove(sn);
|
||||
}
|
||||
}
|
||||
// 目标场景仅加载一次:标记已加载后不再重复 LoadSceneAsync(防止人机通知触发重复加载)
|
||||
if (!string.IsNullOrEmpty(sceneName) && !_loadedGameScenes.Contains(sceneName))
|
||||
{
|
||||
_loadedGameScenes.Add(sceneName);
|
||||
var targetScene = SceneManager.GetSceneByName(sceneName);
|
||||
if (!targetScene.IsValid() || !targetScene.isLoaded)
|
||||
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 if (UIManager.Instance.Get<GameMainPanel_Base>(uIPanel) != null)
|
||||
else
|
||||
{
|
||||
// 面板已存在 → 新玩家加入,转发给现有面板激活座位
|
||||
var panel = UIManager.Instance.Get<GameMainPanel_Base>(uIPanel);
|
||||
@@ -147,7 +155,6 @@ namespace Assets.MyGame.Scripts.Net
|
||||
}
|
||||
}
|
||||
}
|
||||
// else: 场景正在加载中(_loadingGamePanels 含此 uIPanel),忽略本次重复通知
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user