From 01956864080067650e9f012df510d08ef3fa14d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A3=AE2003?= <2384017988@qq.com> Date: Sat, 1 Aug 2026 15:58:39 +0800 Subject: [PATCH] 1 --- Assets/Framework/Tool/UITool/UIManager.cs | 6 +++-- .../aa/UI/Game/GameMainPanel_FishBase.cs | 25 ++++++++----------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/Assets/Framework/Tool/UITool/UIManager.cs b/Assets/Framework/Tool/UITool/UIManager.cs index a85d7ee32..c8bcc5c18 100644 --- a/Assets/Framework/Tool/UITool/UIManager.cs +++ b/Assets/Framework/Tool/UITool/UIManager.cs @@ -249,22 +249,24 @@ public class UIManager : MonoSingleton } /// /// 显示提示窗口(随时访问)。不自动关闭,需手动点确认/关闭按钮。 + /// 返回 TiShi 实例,调用方可持有引用判断弹窗是否仍存在(已被销毁时 == null 为 true)。 /// /// 提示内容 /// 点击确认按钮时的回调(可选),关闭按钮不触发 /// 是否显示关闭按钮(默认 true,部分提示只能点确认) - public void ShowTiShi(string text, Action onConfirmAction = null, bool showClose = true) + public TiShi ShowTiShi(string text, Action onConfirmAction = null, bool showClose = true) { if (TiShiParefab == null) { Debug.LogWarning("TiShiParefab 未赋值"); - return; + return null; } var obj = Instantiate(TiShiParefab, uiRoot); obj.transform.SetAsLastSibling(); var tishi = obj.GetComponent(); if (tishi != null) tishi.Init(text, onConfirmAction, showClose); + return tishi; } IEnumerator IEShowHuoDe(List backPackPropItemDatas, Action onCloseAction) { diff --git a/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs b/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs index 49a1586f5..e822b86cf 100644 --- a/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs +++ b/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs @@ -2126,11 +2126,11 @@ public class GameMainPanel_FishBase : GameMainPanel_Base } /// - /// 防止金币不足退出房间弹窗重复弹出。 - /// 一旦弹出后保持 true,直到金币恢复到能发射最小炮倍才重置, - /// 确保同一时段内屏幕上最多只显示一个弹窗。 + /// 金币不足退出房间弹窗的引用。 + /// 弹窗存在期间不为 null(被 Destroy 后 Unity fake null,== null 为 true), + /// 用于确保屏幕上同一时间最多只显示一个弹窗,散射/自动开火也不会重复弹出。 /// - private bool _isGoldInsufficientPanelShown = false; + private TiShi _goldInsufficientPanel = null; /// /// 获取当前房间最小炮倍(paoBeiList 中的最小值) @@ -2146,7 +2146,8 @@ public class GameMainPanel_FishBase : GameMainPanel_Base /// 金币不足则不切换攻击状态、不发送开炮请求,避免无效请求与服务端拒绝。 /// ⭐ 当金币不足以发射最小炮倍时,弹窗询问是否退出房间: /// 确认 → 走退出房间逻辑;X号 → 关闭面板。本地判断,不发送开炮请求。 - /// 弹窗期间通过 _isGoldInsufficientPanelShown 保证全局只显示一个。 + /// 通过 _goldInsufficientPanel 引用检测保证全局只显示一个弹窗, + /// 弹窗未关闭前绝不重复弹出(散射/自动开火每帧检测也只弹一次)。 /// private bool HasEnoughGoldToFire(bool isSanShe) { @@ -2155,27 +2156,23 @@ public class GameMainPanel_FishBase : GameMainPanel_Base long need = currSitData.consumeGoldNum * count; if (currSitData.goldNum >= need) { - // 金币够当前炮倍:重置弹窗标志 - _isGoldInsufficientPanelShown = false; + // 金币够当前炮倍:可正常开火 return true; } // 金币不足当前炮倍:进一步判断是否连最小炮倍都发射不起 long minConsume = GetMinConsumeGold(); - - // 金币恢复到能发射最小炮倍 → 重置弹窗标志,允许下次不足时再次弹窗 if (minConsume <= 0 || currSitData.goldNum >= minConsume) { - _isGoldInsufficientPanelShown = false; + // 金币够最小炮倍:玩家可降炮倍继续游戏,不弹窗 return false; } // ⭐ 金币不足以发射最小炮倍 → 弹窗询问是否退出房间 - // _isGoldInsufficientPanelShown 保证只弹一个,不重复 - if (!_isGoldInsufficientPanelShown) + // 关键:只有当前没有弹窗时才弹,避免散射/自动开火反复弹窗 + if (_goldInsufficientPanel == null) { - _isGoldInsufficientPanelShown = true; - UIManager.Instance.ShowTiShi( + _goldInsufficientPanel = UIManager.Instance.ShowTiShi( "金币不足,是否退出房间?", () => RequestLeaveRoom(), true);