From 77a8353a79316f4b29e18d1659d6f2fcf1e366d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A3=AE2003?= <2384017988@qq.com> Date: Wed, 30 Sep 2026 23:50:42 +0800 Subject: [PATCH] 1 --- .../Scripts/Manager/CreateFishManager.cs | 30 ++++++- Assets/MyGame/Scripts/Turret/SitPosData.cs | 5 +- .../aa/UI/Game/GameMainPanel_FishBase.cs | 86 ++++++++++++++----- Assets/MyGame/aa/UI/Game/Sub/SuoDingPanel.cs | 4 +- 4 files changed, 98 insertions(+), 27 deletions(-) diff --git a/Assets/MyGame/Scripts/Manager/CreateFishManager.cs b/Assets/MyGame/Scripts/Manager/CreateFishManager.cs index 0c4735159..1c16d321f 100644 --- a/Assets/MyGame/Scripts/Manager/CreateFishManager.cs +++ b/Assets/MyGame/Scripts/Manager/CreateFishManager.cs @@ -1148,9 +1148,8 @@ public class CreateFishManager : MonoSingleton StartCoroutine(IeShanXing(createFishData, yz, pos, prefab, pathList, time, yz.fishCount, arraySeq)); break; - case "701": // 环形阵:同帧同路径全部生成(无延迟) - for (int li = 0; li < pathList.Count; li++) - Quan(createFishData, yz, pos, prefab, pathList[li], yz.fishCount, time, arraySeq, li); + case "701": // 环形阵:无延迟;同一鱼阵内重复同一条线(同一出生点)时延迟 1s 再发射 + StartCoroutine(IeQuan(createFishData, yz, pos, prefab, pathList, time, yz.fishCount, arraySeq)); break; case "702": @@ -1238,6 +1237,31 @@ public class CreateFishManager : MonoSingleton } } + /// + /// 环形阵:按路线列表遍历生成圈。 + /// 正常无延迟(同帧出);⭐ 同一鱼阵内出现重复的同一条线(同一出生点)时, + /// 延迟 1s 再发射,避免两圈叠在出生点。 + /// + private IEnumerator IeQuan(FrameData_CreateFish createFishData, FishArrayConfig yz, + Vector3 pos, GameObject prefab, List pathList, long time, int count, int arraySeq) + { + var usedLines = new HashSet(); + for (int lineIndex = 0; lineIndex < pathList.Count; lineIndex++) + { + if (!isResources) + { + yield break; + } + + int pathId = pathList[lineIndex]; + // ⭐ 该线本次鱼阵已出现过(同一出生点):延迟 1s 再发射 + if (!usedLines.Add(pathId)) + yield return new WaitForSeconds(1f); + + Quan(createFishData, yz, pos, prefab, pathId, count, time, arraySeq, lineIndex); + } + } + /// /// 环形阵:在同一路径上生成 count 条鱼,角度均匀分布(360/count)。 /// diff --git a/Assets/MyGame/Scripts/Turret/SitPosData.cs b/Assets/MyGame/Scripts/Turret/SitPosData.cs index 33cb7b80a..052e752c9 100644 --- a/Assets/MyGame/Scripts/Turret/SitPosData.cs +++ b/Assets/MyGame/Scripts/Turret/SitPosData.cs @@ -539,7 +539,10 @@ public class SitPosData : MonoBehaviour, IPointerDownHandler, IPointerUpHandler var mon = tripleLockTargets[i]; // 主目标(monCotl_Lock)已在上面加过,跳过避免重复 if (mon == monCotl_Lock) continue; - if (mon == null || mon.isDead || pos == null || !pos.gameObject.activeInHierarchy) continue; + // ⭐ 口径与锁定圈一致:只看是否还在场上(activeInHierarchy)。 + // 之前额外用 isDead 过滤,导致死亡动画期间"圈还在、激光少一条" + if (mon == null || !mon.gameObject.activeInHierarchy) continue; + if (pos == null || !pos.gameObject.activeInHierarchy) continue; _laserTargets.Add(pos); } } diff --git a/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs b/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs index e111fa91b..14e5a6163 100644 --- a/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs +++ b/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs @@ -981,6 +981,9 @@ public class GameMainPanel_FishBase : GameMainPanel_Base { // ⭐ 取消锁定开关 → 重置自动锁定激活状态,下次需重新手动锁定激活 _autoLockActivated = false; + // ⭐ 同时退出"图鉴锁定"模式:下次再开锁定开关 = 正常锁定(不受图鉴勾选约束) + _suoDingMode = false; + _tripleLockWaitManual = false; // 本地清理锁定 if (currSitData != null) @@ -3410,23 +3413,28 @@ public class GameMainPanel_FishBase : GameMainPanel_Base { if (currSitData == null) return; - // ⭐ 散射激光模式标记(座位用它激活左右起点球父对象):战神+三发+锁定开着+有锁定目标就算散射中, - // 不依赖实际凑满几个目标(目标不足时散射模式开着也要显示起点球) - // ⭐ 正常炮台三合一打一个,不算散射激光模式(不显示左右起点球) - currSitData.isScatterLaserOn = toggle_Three != null && toggle_Three.isOn - && toggle_Lock != null && toggle_Lock.isOn - && currSitData.isLock - && currSitData.currentZhanShenData != null; + // ⭐ 是否处于"战神+三发+锁定"模式(⭐与有没有锁定目标无关:不再和 isLock 循环依赖, + // 否则三格全空→isLock=false→这里判定退出三发→把玩家"等手动点击"的锁位全清掉) + bool tripleModeOn = IsZhanShenTripleMode(); - // ⭐ 三发锁定圈(3个圈)只在战神模式显示;正常炮台三合一只有主锁圈(1个) - bool isTripleLock = currSitData.isScatterLaserOn; - if (!isTripleLock) + if (!tripleModeOn) { - currSitData.HideTripleLockIcons(); + // 不在三发模式 → 清掉三发锁位,回到单锁逻辑(主锁 monCotl_Lock 保留,继续当单锁用) + currSitData.isScatterLaserOn = false; + _tripleLockWaitManual = false; + if (currSitData.tripleLockTargets.Count > 0) + currSitData.HideTripleLockIcons(); return; } - // 已经有三发目标 → 跳过 + // ⭐ 散射标记:三发模式下只要有锁定目标就算散射中(目标不足也要显示左右起点球) + currSitData.isScatterLaserOn = currSitData.HasAnyTripleTarget + || (currSitData.isLock && currSitData.monCotl_Lock != null); + + // ⭐ 三发锁位全空后处于"等玩家手动点击"状态 → 不再自动建位 + if (_tripleLockWaitManual) return; + + // 已经有锁位 → 跳过 if (currSitData.tripleLockTargets.Count > 0) return; var targets = FindFireTargets(3); @@ -3437,6 +3445,13 @@ public class GameMainPanel_FishBase : GameMainPanel_Base /// 自动锁定是否已激活:玩家首次手动锁定一条鱼后激活,该鱼死亡后开始自动转换目标 private bool _autoLockActivated = false; + /// + /// ⭐ 三发锁位全空(打死后自动检测不到鱼)→ 进入"等玩家手动点击"状态: + /// 不再自动建位/自动补位,直到玩家手动点鱼或退出三发模式。 + /// ⭐ 只作用于三发流程,不动全局的 _autoLockActivated(否则会污染普通模式的自动锁定)。 + /// + private bool _tripleLockWaitManual = false; + private void HandleLock() { // ⭐ 退出倒计时期间屏蔽本地玩家手动锁定,其他玩家和机器人不受影响 @@ -3512,6 +3527,7 @@ public class GameMainPanel_FishBase : GameMainPanel_Base currSitData.PushTripleLockSlot(monster, lockTr); currSitData.isManualLock = true; _autoLockActivated = true; + _tripleLockWaitManual = false; // ⭐ 玩家手动点鱼 → 退出"等手动点击"状态 SyncLock(currSitData.GetTripleLockGuids(), colliderIndex); return; } @@ -3643,9 +3659,18 @@ public class GameMainPanel_FishBase : GameMainPanel_Base RefillTripleLockSlot(i); } - // ⭐ 三个锁位全空 → 暂时不锁定,等玩家手动点击才锁(关掉自动锁定激活标记) + // ⭐ 三个锁位全空 → 暂时不锁定:清锁 + 炮台姿态回 Idle + 同步服务器, + // 并进入"等玩家手动点击"状态(⭐只作用于三发流程,不再动全局的 _autoLockActivated) if (!currSitData.HasAnyTripleTarget) - _autoLockActivated = false; + { + if (!_tripleLockWaitManual) + { + _tripleLockWaitManual = true; + currSitData.ClearLock(); // 清锁位/主锁/图标 + ChangeState(Idle) + SyncTurretState(TurretState.Idle); + SyncLock(null); // 同步服务器:取消锁定(原来三发分支漏了这步) + } + } return; } @@ -3757,14 +3782,24 @@ public class GameMainPanel_FishBase : GameMainPanel_Base return null; } + /// + /// ⭐ "图鉴锁定"模式标记。区分两种锁定入口: + /// - false(默认):正常锁定 —— 直接点 toggle_Lock 打开,或直接点鱼锁定。**完全不受图鉴勾选约束**。 + /// - true:图鉴锁定 —— 长按锁定 toggle 打开图鉴面板、勾选完关闭后进入,只锁勾选的那几种鱼。 + /// ⭐ 只有 true 时白名单(selectedSet)才参与判断;关掉锁定开关即退出该模式。 + /// + private bool _suoDingMode = false; + /// /// ⭐ 单独锁定白名单(SuoDingPanel):是否允许自动锁定这条鱼。 - /// - 面板从未打开过(不存在) 或 一个都没勾 → 不限制(走原有优先级规则) - /// - 勾选了至少一条 → 只允许锁定勾选的鱼(固定锁定这几个选中的鱼) + /// - 非"图鉴锁定"模式 → 不限制(正常锁定想锁什么就锁什么) + /// - 图鉴锁定模式:一个都没勾 → 不限制;勾了至少一条 → 只允许锁勾选的鱼 /// 手动锁定(玩家点击选鱼)不受此限制。 /// private bool IsFishAllowedBySuoDing(MonsterContral m) { + // ⭐ 只有走"长按图鉴"那条路才启用白名单,避免图鉴勾选干扰正常锁定 + if (!_suoDingMode) return true; if (m == null) return false; var panel = subUIManager.Get(UIPanel.GameSuoDing); if (panel == null || !panel.HasSelection) return true; @@ -3775,8 +3810,9 @@ public class GameMainPanel_FishBase : GameMainPanel_Base /// ⭐ SuoDing 面板关闭时应用勾选结果(由 SuoDingPanel.OnHide 回调): /// 1. 打开锁定开关(toggle_Lock) /// 2. 直接激活自动锁定(跳过"先手动锁定一条鱼"的前提) - /// 3. 当前手动锁定的目标转为自动锁定 → 立即受白名单约束 - /// 白名单(selectedSet)由面板 Toggle 实时同步;之后的自动锁定仍按原有优先级 + /// 3. 有勾选 → 进入"图鉴锁定"模式:之后的锁定只从勾选的鱼里选目标 + /// ⭐ 一个都没勾 → 不进入图鉴模式(白名单不生效),等同于正常锁定,不会干扰正常玩法。 + /// 白名单(selectedSet)由面板 Toggle 实时同步;自动锁定仍按原有优先级 /// (特殊Boss > Boss鱼 > 特殊鱼 > 黄金鱼)只从选中的鱼里选目标,选中的鱼死光则不锁定。 /// public void ApplySuoDingSelection() @@ -3785,12 +3821,18 @@ public class GameMainPanel_FishBase : GameMainPanel_Base if (toggle_Lock != null && !toggle_Lock.isOn) toggle_Lock.isOn = true; + // ⭐ 有勾选才算"图鉴锁定"模式(默认全不选 → 保持正常锁定) + var panel = subUIManager.Get(UIPanel.GameSuoDing); + _suoDingMode = panel != null && panel.HasSelection; + // ⭐ 面板选完即应用:自动锁定立即开始找目标 _autoLockActivated = true; + // ⭐ 三发模式:退出"等手动点击"状态,允许重新按勾选建位 + _tripleLockWaitManual = false; - // ⭐ 当前若是手动锁定 → 转为自动锁定: - // 在勾选白名单里 → 继续锁(无缝);不在白名单/即将离场 → HandleAutoLock 立即换白名单里的目标 - if (currSitData != null && currSitData.isManualLock) + // ⭐ 只有进入图鉴模式时,才把当前手动锁定的目标转为自动锁定(交给白名单筛选); + // 正常锁定(没勾选)保持手动锁定不动,避免把玩家点的鱼放掉 + if (_suoDingMode && currSitData != null && currSitData.isManualLock) currSitData.isManualLock = false; } @@ -3812,6 +3854,8 @@ public class GameMainPanel_FishBase : GameMainPanel_Base // ⭐⭐⭐ 三发模式:每个锁位由 CheckLockTargetValid 逐位独立维护(死一条只补那一条), // 这里不再插手,否则"死一条鱼会导致三个锁定目标全部重新寻找" if (currSitData.tripleLockTargets.Count > 0) return; + // ⭐ 三发锁位全空后处于"等玩家手动点击"状态 → 不自动接管(否则会和"等手动点击"的语义打架) + if (_tripleLockWaitManual && IsZhanShenTripleMode()) return; // ⭐⭐⭐ 换目标规则(当前使用:立即升级版): // ① 手动锁定 → 玩家自己点的鱼,离场前一直跟,死了才换 diff --git a/Assets/MyGame/aa/UI/Game/Sub/SuoDingPanel.cs b/Assets/MyGame/aa/UI/Game/Sub/SuoDingPanel.cs index aedc333d3..4c858723d 100644 --- a/Assets/MyGame/aa/UI/Game/Sub/SuoDingPanel.cs +++ b/Assets/MyGame/aa/UI/Game/Sub/SuoDingPanel.cs @@ -49,8 +49,8 @@ public class SuoDingPanel : SubUIBase if (btn_DeselectAll != null) btn_DeselectAll.onClick.AddListener(DeselectAll); BuildList(); - // ⭐ 默认全选:锁定目标=全部高价值鱼(和当前自动锁定行为一致),玩家在面板里再手动调整 - SelectAll(); + // ⭐ 默认全部不选:不勾选 = 不限制(正常锁定),玩家想锁哪条就勾哪条 + DeselectAll(); } protected override void OnShow(object args = null)