diff --git a/Assets/MyGame/aa/UI/Game/FLZY/GameMainPanel_FLZY.prefab b/Assets/MyGame/aa/UI/Game/FLZY/GameMainPanel_FLZY.prefab index c13b5a2d0..d1c65a016 100644 --- a/Assets/MyGame/aa/UI/Game/FLZY/GameMainPanel_FLZY.prefab +++ b/Assets/MyGame/aa/UI/Game/FLZY/GameMainPanel_FLZY.prefab @@ -3184,6 +3184,7 @@ MonoBehaviour: btn_ChangeTurret: {fileID: 2489664132425475855} btn_TuiChu: {fileID: 780773369580813426} btn_Setting: {fileID: 4961327186688897109} + btn_ChangeRoom: {fileID: 4081004395951680277} mySitAnim: {fileID: 880553518363789260} toggle_Lock: {fileID: 7956581350814959936} toggle_Three: {fileID: 911966240696267575} @@ -8553,6 +8554,18 @@ RectTransform: type: 3} m_PrefabInstance: {fileID: 8339597464346707846} m_PrefabAsset: {fileID: 0} +--- !u!114 &4081004395951680277 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 5412922497758899347, guid: 87a141ee6b07c324b91593c88bd1db9c, + type: 3} + m_PrefabInstance: {fileID: 8339597464346707846} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!114 &4961327186688897109 stripped MonoBehaviour: m_CorrespondingSourceObject: {fileID: 3991912750857467859, guid: 87a141ee6b07c324b91593c88bd1db9c, diff --git a/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs b/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs index 9ccec335f..a4514e5ff 100644 --- a/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs +++ b/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs @@ -809,18 +809,25 @@ public class GameMainPanel_FishBase : GameMainPanel_Base #region 资源加载模块 public async void LoadResources() { + // ⭐ 切换房间:隐藏新面板自带的进度条,继续用离房时留下的合并进度条 + // (挂在 uiRoot、盖在最上层),避免"退出+加入"显示两条进度条 + if (_changeRoomBar != null) + { + if (JinDuTiao != null) JinDuTiao.Hide(); + _changeRoomBar.transform.SetAsLastSibling(); + } CreateFishManager.Instance.isResources = false; // ⭐ 重置卸载标记,下次进入可重新加载 _resourcesUnloaded = false; await AudioResourcesData.LoadAudioGame(); - JinDuTiao.SetProgress(0.2f); + SetLoadProgress(0.2f); await MonsterMoveLine.LoadBezier(); - JinDuTiao.SetProgress(0.4f); + SetLoadProgress(0.4f); await FishResourcesData.LoadFishAssetsData(); - JinDuTiao.SetProgress(0.6f); + SetLoadProgress(0.6f); await Addressables.LoadAssetsAsync("Audio", clip => { @@ -828,13 +835,13 @@ public class GameMainPanel_FishBase : GameMainPanel_Base bulletClip = clip; }).Task; - JinDuTiao.SetProgress(0.8f); + SetLoadProgress(0.8f); await Task.Delay(100); CreateFishManager.Instance.EnterRoom(gameType); CreateFishManager.Instance.isResources = true; - JinDuTiao.SetProgress(0.9f); + SetLoadProgress(0.9f); // ⭐ 鱼创建由服务端 OnFishSpawn 事件统一下发,客户端无需房主出鱼/请求同步。 @@ -859,10 +866,14 @@ public class GameMainPanel_FishBase : GameMainPanel_Base } await Task.Delay(2000); - JinDuTiao.SetProgress(1); + SetLoadProgress(1); await Task.Delay(300); - JinDuTiao.Hide(); + // ⭐ 切换房间:合并进度条走完 → 隐藏并销毁;平时隐藏面板自己的进度条 + if (_changeRoomBar != null) + ClearChangeRoomBar(); + else if (JinDuTiao != null) + JinDuTiao.Hide(); } public async void UnLoadResources() @@ -926,16 +937,16 @@ public class GameMainPanel_FishBase : GameMainPanel_Base { if (JinDuTiao != null) JinDuTiao.Show(); - if (JinDuTiao != null) JinDuTiao.SetProgress(0.2f); + SetUnloadProgress(0.2f); await FishResourcesData.UnLoadFishAssetsData(); - if (JinDuTiao != null) JinDuTiao.SetProgress(0.4f); + SetUnloadProgress(0.4f); await AudioResourcesData.UnLoadAudioGame(); - if (JinDuTiao != null) JinDuTiao.SetProgress(0.6f); + SetUnloadProgress(0.6f); await MonsterMoveLine.UnLoadBezier(); - if (JinDuTiao != null) JinDuTiao.SetProgress(0.8f); + SetUnloadProgress(0.8f); await Task.Delay(100); CreateFishManager.Instance.ExitRoom(); @@ -943,7 +954,7 @@ public class GameMainPanel_FishBase : GameMainPanel_Base // ⭐ 清空子弹池 + 特效池(鱼池已在 UnLoadFishAssetsData 内清理) BulletPool.Instance.ClearAll(); EffectPool.Instance.ClearAll(); - if (JinDuTiao != null) JinDuTiao.SetProgress(0.9f); + SetUnloadProgress(0.9f); // ⭐ 卡在 0.9 等待 socket 返回 LeaveRoomResult // - socket 已早返回(比卸载快) → 在 0.9 再等 1 秒(美观)后变 1 @@ -987,9 +998,19 @@ public class GameMainPanel_FishBase : GameMainPanel_Base // 标记已卸载,OnHide 跳过重复卸载 _resourcesUnloaded = true; - if (JinDuTiao != null) JinDuTiao.SetProgress(1); - await Task.Delay(300); - if (JinDuTiao != null) JinDuTiao.Hide(); + if (_isChangeRoom) + { + // ⭐ 切换房间:进度条停在卸载段末尾(合并进度条45%)不隐藏, + // 由 finally 挪到 uiRoot 后继续给"换房+加入加载段"使用 → 整个切换只有一条进度条 + SetUnloadProgress(1); + await Task.Delay(300); + } + else + { + if (JinDuTiao != null) JinDuTiao.SetProgress(1); + await Task.Delay(300); + if (JinDuTiao != null) JinDuTiao.Hide(); + } } catch (Exception ex) { @@ -1000,20 +1021,34 @@ public class GameMainPanel_FishBase : GameMainPanel_Base // ⭐ 无论中间是否异常,都必须关闭 GamePanel // 否则 GamePanel 留在 panels 字典里,下次进入游戏时 Get 返回非 null 导致无法创建新面板 _leaveRoomResponseTcs = null; - if (JinDuTiao != null) - { - try { JinDuTiao.Hide(); } catch { } - } if (_isChangeRoom) { - // ⭐ 切换房间:不回大厅,关闭当前游戏面板(OnHide 卸载场景/关socket), - // 然后重新走一遍加入房间流程(QuickJoin → 连新房socket → JoinRoom → RoomJoinNotice 重建面板) + // ⭐ 切换房间:不回大厅。先把进度条从旧面板挪到 uiRoot(旧面板销毁时不带走它), + // 新面板 LoadResources 继续用它走完"换房+加载段"→ 退出+加入合并为一条进度条; + // 然后关闭当前游戏面板(OnHide 卸载场景/关socket)并重新走加入房间流程 _isChangeRoom = false; + if (JinDuTiao != null) + { + try + { + JinDuTiao.transform.SetParent(UIManager.Instance.uiRoot, false); + JinDuTiao.transform.SetAsLastSibling(); + _changeRoomBar = JinDuTiao; + } + catch (Exception barEx) + { + Debug.LogError($"[ChangeRoom] 合并进度条转移异常: {barEx}"); + } + } UIManager.Instance.Close(PanelType); StartChangeRoomJoin(); } else { + if (JinDuTiao != null) + { + try { JinDuTiao.Hide(); } catch { } + } // 进入 home 界面(关闭当前游戏面板) switch (GameManager.Instance.gameData.currGameType) { @@ -1064,6 +1099,50 @@ public class GameMainPanel_FishBase : GameMainPanel_Base /// 正在切换房间(离房完成后不回大厅,直接重新快速加入新房间) private bool _isChangeRoom = false; + /// + /// 切换房间共享进度条:离房时从旧面板挪到 uiRoot(不随旧面板销毁), + /// 新面板 LoadResources 继续用它,把"退出卸载 + 换房 + 加入加载"合并成一条进度条: + /// 卸载段 0~45% → 网络段(QuickJoin/连socket/JoinRoom) 45~55% → 加载段 55~100%。 + /// null 表示非切换房间流程(走面板自己的 JinDuTiao)。 + /// + private static ProgressBar _changeRoomBar; + + /// 卸载段进度写入:切换房间时映射到合并进度条前半段(0~45%),平时直接写面板进度条 + private void SetUnloadProgress(float p) + { + if (JinDuTiao == null) return; + JinDuTiao.SetProgress(_isChangeRoom ? p * 0.45f : p); + } + + /// 加载段进度写入:切换房间时映射到合并进度条后半段(55~100%),平时直接写面板进度条 + private void SetLoadProgress(float p) + { + if (_changeRoomBar != null) + _changeRoomBar.SetProgress(0.55f + p * 0.45f); + else if (JinDuTiao != null) + JinDuTiao.SetProgress(p); + } + + /// 写切换房间合并进度条(网络段:QuickJoin返回/JoinRoom已发送) + private static void SetChangeRoomBarProgress(float p) + { + if (_changeRoomBar != null) _changeRoomBar.SetProgress(p); + } + + /// 隐藏并销毁切换房间合并进度条(加载完成或切房失败时调用) + private static void ClearChangeRoomBar() + { + if (_changeRoomBar == null) return; + var bar = _changeRoomBar; + _changeRoomBar = null; + try + { + bar.Hide(); + if (bar != null) Destroy(bar.gameObject); + } + catch { } + } + /// /// 切换房间入口:复用离房流程(LeaveRoom → 卸载资源 → 关面板), /// 离房完成后由 BeginLeaveRoomUnload 的 finally 重新走加入房间流程。 @@ -1081,6 +1160,8 @@ public class GameMainPanel_FishBase : GameMainPanel_Base /// 重新走加入房间流程(与 UIHome_BY_SelectRoomLevelPanel.OnSelectRoom 快速进入分支完全一致): /// /api/Room/QuickJoin(同场次同等级,服务器分配新房间)→ 连新房 game socket → JoinRoom(-1) 由服务器分配座位, /// 之后服务端推送 RoomJoinNotice → 重新创建游戏面板 + 重载场景,完成切换。 + /// ⭐ 切房全程共用一条进度条:卸载段0~45%已在离房时走完,这里推进网络段45~55%, + /// 剩余加载段55~100%由新面板 LoadResources 继续。 /// private void StartChangeRoomJoin() { @@ -1091,14 +1172,19 @@ public class GameMainPanel_FishBase : GameMainPanel_Base { if (resp == null || string.IsNullOrEmpty(resp.roomId)) { - // ⭐ 快速加入失败 → 回大厅,避免卡在无界面状态 + // ⭐ 快速加入失败 → 清理合并进度条并回大厅,避免卡在无界面状态 UIManager.Instance.ShowBoardError("切换房间失败,请稍后重试"); + ClearChangeRoomBar(); UIManager.Instance.ShowAsync(UIPanel.HomeMainPanel, GameManager.Instance.gameData.currGameType); return; } + // 合并进度条:已拿到新房间(网络段 50%) + SetChangeRoomBarProgress(0.5f); // 用 QuickJoin 返回的 webSocketUrl 直接连新房 game socket,然后 JoinRoom(-1) 让服务器分配座位 GameManager.Instance.StartGameQuickJoin(resp.webSocketUrl, () => { + // 合并进度条:JoinRoom 已发送(网络段 55%,加载段起点) + SetChangeRoomBarProgress(0.55f); WebSocketSendList.JoinRoom(resp.roomId, GameManager.Instance.user.id, -1); }); });