This commit is contained in:
2026-09-30 23:50:42 +08:00
parent e38f0832a4
commit 77a8353a79
4 changed files with 98 additions and 27 deletions
@@ -1148,9 +1148,8 @@ public class CreateFishManager : MonoSingleton<CreateFishManager>
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<CreateFishManager>
}
}
/// <summary>
/// 环形阵:按路线列表遍历生成圈。
/// 正常无延迟(同帧出);⭐ 同一鱼阵内出现重复的同一条线(同一出生点)时,
/// 延迟 1s 再发射,避免两圈叠在出生点。
/// </summary>
private IEnumerator IeQuan(FrameData_CreateFish createFishData, FishArrayConfig yz,
Vector3 pos, GameObject prefab, List<int> pathList, long time, int count, int arraySeq)
{
var usedLines = new HashSet<int>();
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);
}
}
/// <summary>
/// 环形阵:在同一路径上生成 count 条鱼,角度均匀分布(360/count)。
/// </summary>
+4 -1
View File
@@ -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);
}
}
@@ -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
/// <summary>自动锁定是否已激活:玩家首次手动锁定一条鱼后激活,该鱼死亡后开始自动转换目标</summary>
private bool _autoLockActivated = false;
/// <summary>
/// ⭐ 三发锁位全空(打死后自动检测不到鱼)→ 进入"等玩家手动点击"状态:
/// 不再自动建位/自动补位,直到玩家手动点鱼或退出三发模式。
/// ⭐ 只作用于三发流程,不动全局的 _autoLockActivated(否则会污染普通模式的自动锁定)。
/// </summary>
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;
}
/// <summary>
/// ⭐ "图鉴锁定"模式标记。区分两种锁定入口:
/// - false(默认):正常锁定 —— 直接点 toggle_Lock 打开,或直接点鱼锁定。**完全不受图鉴勾选约束**。
/// - true:图鉴锁定 —— 长按锁定 toggle 打开图鉴面板、勾选完关闭后进入,只锁勾选的那几种鱼。
/// ⭐ 只有 true 时白名单(selectedSet)才参与判断;关掉锁定开关即退出该模式。
/// </summary>
private bool _suoDingMode = false;
/// <summary>
/// ⭐ 单独锁定白名单(SuoDingPanel):是否允许自动锁定这条鱼。
/// - 面板从未打开过(不存在) 或 一个都没勾 → 不限制(走原有优先级规则)
/// - 勾选了至少一条 → 只允许锁定勾选的鱼(固定锁定这几个选中的鱼)
/// - 非"图鉴锁定"模式 → 不限制(正常锁定想锁什么就锁什么)
/// - 图鉴锁定模式:一个都没勾 → 不限制;勾了至少一条 → 只允许锁勾选的鱼
/// 手动锁定(玩家点击选鱼)不受此限制。
/// </summary>
private bool IsFishAllowedBySuoDing(MonsterContral m)
{
// ⭐ 只有走"长按图鉴"那条路才启用白名单,避免图鉴勾选干扰正常锁定
if (!_suoDingMode) return true;
if (m == null) return false;
var panel = subUIManager.Get<SuoDingPanel>(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鱼 > 特殊鱼 > 黄金鱼)只从选中的鱼里选目标,选中的鱼死光则不锁定。
/// </summary>
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<SuoDingPanel>(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;
// ⭐⭐⭐ 换目标规则(当前使用:立即升级版):
// ① 手动锁定 → 玩家自己点的鱼,离场前一直跟,死了才换
+2 -2
View File
@@ -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)