This commit is contained in:
2026-09-04 01:07:54 +08:00
parent 9b90277ed1
commit f4d4718811
2 changed files with 121 additions and 22 deletions
@@ -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,
@@ -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<AudioClip>("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
/// <summary>正在切换房间(离房完成后不回大厅,直接重新快速加入新房间)</summary>
private bool _isChangeRoom = false;
/// <summary>
/// 切换房间共享进度条:离房时从旧面板挪到 uiRoot(不随旧面板销毁),
/// 新面板 LoadResources 继续用它,把"退出卸载 + 换房 + 加入加载"合并成一条进度条:
/// 卸载段 0~45% → 网络段(QuickJoin/连socket/JoinRoom) 45~55% → 加载段 55~100%。
/// null 表示非切换房间流程(走面板自己的 JinDuTiao)。
/// </summary>
private static ProgressBar _changeRoomBar;
/// <summary>卸载段进度写入:切换房间时映射到合并进度条前半段(0~45%),平时直接写面板进度条</summary>
private void SetUnloadProgress(float p)
{
if (JinDuTiao == null) return;
JinDuTiao.SetProgress(_isChangeRoom ? p * 0.45f : p);
}
/// <summary>加载段进度写入:切换房间时映射到合并进度条后半段(55~100%),平时直接写面板进度条</summary>
private void SetLoadProgress(float p)
{
if (_changeRoomBar != null)
_changeRoomBar.SetProgress(0.55f + p * 0.45f);
else if (JinDuTiao != null)
JinDuTiao.SetProgress(p);
}
/// <summary>写切换房间合并进度条(网络段:QuickJoin返回/JoinRoom已发送)</summary>
private static void SetChangeRoomBarProgress(float p)
{
if (_changeRoomBar != null) _changeRoomBar.SetProgress(p);
}
/// <summary>隐藏并销毁切换房间合并进度条(加载完成或切房失败时调用)</summary>
private static void ClearChangeRoomBar()
{
if (_changeRoomBar == null) return;
var bar = _changeRoomBar;
_changeRoomBar = null;
try
{
bar.Hide();
if (bar != null) Destroy(bar.gameObject);
}
catch { }
}
/// <summary>
/// 切换房间入口:复用离房流程(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 继续。
/// </summary>
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);
});
});