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);