diff --git a/Assets/MyGame/aa/Game/HHWK/MonsterTSY/DieEffect_TSY.cs b/Assets/MyGame/aa/Game/HHWK/MonsterTSY/DieEffect_TSY.cs index 702f1048b..5ae969bf4 100644 --- a/Assets/MyGame/aa/Game/HHWK/MonsterTSY/DieEffect_TSY.cs +++ b/Assets/MyGame/aa/Game/HHWK/MonsterTSY/DieEffect_TSY.cs @@ -135,11 +135,11 @@ public class DieEffect_TSY : BJEventBase ? parentTransform : CreateFishManager.Instance.bjEffectRoot; - // 基准位置:座位坐标 + 手调偏移 - Vector3 basePos = CreateFishManager.Instance.currGameType != null - && CreateFishManager.Instance.currGameType.currSitData != null - ? CreateFishManager.Instance.currGameType.currSitData.transform.position - : transform.position; + // 基准位置:击杀者座位坐标(按 posID 查找,人机转发时也显示在人机座位) + // Y 偏移与 Boss 一致:posID 0/1 上方 +bjEndUIOffsetY,posID 2/3 下方 -bjEndUIOffsetY + float yOff = bjEndUIOffsetY; + if (posID == 2 || posID == 3) yOff *= -1f; + Vector3 basePos = GetSeatPosition() + Vector3.up * yOff; var effectObj = Instantiate(baoJiangEffectPrefab, parent); effectObj.transform.position = basePos + offsetPosition; diff --git a/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs b/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs index 20948d6ad..5bdc41e1c 100644 --- a/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs +++ b/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs @@ -1585,8 +1585,8 @@ public class GameMainPanel_FishBase : GameMainPanel_Base if (useHitCollider && monster.lockPoint != null && monster.lockPoint.gameObject.activeInHierarchy) return monster.lockPoint; - // ⑤ 最终兜底:monster.transform - return monster.transform; + // ⑤ ⭐ lockPoint 和 colliderList 全部未激活 → 返回 null,调用方应换一条鱼 + return null; } /// 简化重载,不关心 colliderIndex 时用 @@ -1595,6 +1595,27 @@ public class GameMainPanel_FishBase : GameMainPanel_Base return ResolveLockTransform(monster, out _, false); } + /// + /// ⭐ 判断鱼是否有激活的锁定锚点(lockPoint 或 colliderList 中任一碰撞器)。 + /// 鱼出场效果期间 lockPoint 和 collider 都未激活 → 不可锁定,应换一条鱼。 + /// + private bool HasActiveLockPoint(MonsterContral monster) + { + if (monster == null) return false; + // lockPoint 激活 + if (monster.lockPoint != null && monster.lockPoint.gameObject.activeInHierarchy) return true; + // colliderList 任一激活 + if (monster.colliderList != null) + { + for (int i = 0; i < monster.colliderList.Count; i++) + { + var col = monster.colliderList[i]; + if (col != null && col.gameObject.activeInHierarchy) return true; + } + } + return false; + } + #endregion #region 路径进度过滤(锁定范围控制) @@ -1696,9 +1717,12 @@ public class GameMainPanel_FishBase : GameMainPanel_Base if (selected.Contains(m.guid)) continue; // 跳过已选中的 // ⭐ 路径进度过滤:刚出生(< 0.2)或即将离场(> 0.8)的鱼不作为目标 if (!IsFishPathLockable(m)) continue; + // ⭐ 锚点过滤:出场效果期间 lockPoint 和 collider 都未激活 → 跳过换下一条 + if (!HasActiveLockPoint(m)) continue; - // ⭐ 统一用 ResolveLockTransform:colliderList → lockPoint → transform + // ⭐ 统一用 ResolveLockTransform:lockPoint → colliderList → (null则不选) Transform pos = ResolveLockTransform(m); + if (pos == null) continue; result.Add((m, pos)); selected.Add(m.guid); @@ -1791,6 +1815,8 @@ public class GameMainPanel_FishBase : GameMainPanel_Base // ⭐ 手动锁定:useHitCollider=true → 点击碰撞器 → colliderList 激活项 → lockPoint int colliderIndex; Transform lockTr = ResolveLockTransform(monster, out colliderIndex, true); + // ⭐ lockPoint 和 colliderList 全部未激活 → 不锁定这条鱼 + if (lockTr == null) return; currSitData.SetLockTarget(monster, lockTr); SyncLock(new List { monster?.guid }, colliderIndex); @@ -1920,9 +1946,11 @@ public class GameMainPanel_FishBase : GameMainPanel_Base MonsterContral target = FindAutoLockTarget(); if (target != null) { - // ⭐ 统一用 ResolveLockTransform:colliderList 第一个活跃 → lockPoint → transform + // ⭐ 自动锁定:useHitCollider=false → lockPoint → colliderList → null int colliderIndex; Transform lockTr = ResolveLockTransform(target, out colliderIndex); + // ⭐ lockPoint 和 colliderList 全部未激活(出场效果中) → 不锁定,等下一帧再找 + if (lockTr == null) return; currSitData.SetLockTarget(target, lockTr); SyncLock(new List { target?.guid }, colliderIndex); @@ -1930,7 +1958,7 @@ public class GameMainPanel_FishBase : GameMainPanel_Base if (currSitData.lockFX != null && target.gameObject.activeInHierarchy) { if (!currSitData.lockFX.activeSelf) currSitData.lockFX.SetActive(true); - Vector3 p = (lockTr != null && lockTr.gameObject.activeInHierarchy) ? lockTr.position : target.transform.position; + Vector3 p = lockTr.position; p.z = Camera.main.transform.position.z + 1; currSitData.lockFX.transform.position = p; } @@ -1972,6 +2000,8 @@ public class GameMainPanel_FishBase : GameMainPanel_Base if (m == null || !m.gameObject.activeInHierarchy) continue; // ⭐ 路径进度过滤:刚出生(< 0.2)或即将离场(> 0.8)的鱼不作为自动锁定目标 if (!IsFishPathLockable(m)) continue; + // ⭐ 锚点过滤:出场效果期间 lockPoint 和 collider 都未激活 → 跳过换下一条 + if (!HasActiveLockPoint(m)) continue; int pri = GetFishLockPriority(m);