From 23a2af6e47f0bcbbd79cea0ddaf43b2138d0b403 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=A3=AE2003?= <2384017988@qq.com>
Date: Fri, 31 Jul 2026 17:31:51 +0800
Subject: [PATCH] 1
---
.../change_Timeline/Game177_changE.playable | 17 ++++++
.../longma_Timeline/Game177_lm.playable | 17 ++++++
.../Characters/Monster/MonsterContral.cs | 54 +++++++++++++++++++
.../HHWK/Boss/ChangE/Game177_changE.prefab | 16 ++++++
.../HHWK/Boss/XiaoBaiLong/Game177_lm.prefab | 18 ++++++-
.../aa/UI/Game/GameMainPanel_FishBase.cs | 44 +++++++++++----
6 files changed, 154 insertions(+), 12 deletions(-)
diff --git a/Assets/Art/HHWK/res/model/change/change_Timeline/Game177_changE.playable b/Assets/Art/HHWK/res/model/change/change_Timeline/Game177_changE.playable
index b619a7888..78858f5a8 100644
--- a/Assets/Art/HHWK/res/model/change/change_Timeline/Game177_changE.playable
+++ b/Assets/Art/HHWK/res/model/change/change_Timeline/Game177_changE.playable
@@ -368,6 +368,22 @@ MonoBehaviour:
searchHierarchy: 0
active: 1
postPlayback: 2
+--- !u!114 &-4476747023702992453
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 15c38f6fa1940124db1ab7f6fe7268d1, type: 3}
+ m_Name: Signal Emitter
+ m_EditorClassIdentifier:
+ m_Time: 8.033333333333333
+ m_Retroactive: 0
+ m_EmitOnce: 0
+ m_Asset: {fileID: 11400000, guid: 1508e534c5cd88d459d245dd3557a1c6, type: 2}
--- !u!114 &-4462692067342960898
MonoBehaviour:
m_ObjectHideFlags: 1
@@ -414,6 +430,7 @@ MonoBehaviour:
m_Markers:
m_Objects:
- {fileID: -3852160772025241160}
+ - {fileID: -4476747023702992453}
--- !u!114 &-3852160772025241160
MonoBehaviour:
m_ObjectHideFlags: 1
diff --git a/Assets/Art/HHWK/res/model/longma/longma_Timeline/Game177_lm.playable b/Assets/Art/HHWK/res/model/longma/longma_Timeline/Game177_lm.playable
index 71c5263cc..b6694093d 100644
--- a/Assets/Art/HHWK/res/model/longma/longma_Timeline/Game177_lm.playable
+++ b/Assets/Art/HHWK/res/model/longma/longma_Timeline/Game177_lm.playable
@@ -266,6 +266,7 @@ MonoBehaviour:
m_Markers:
m_Objects:
- {fileID: 262044964365021847}
+ - {fileID: -4014953205073901743}
--- !u!114 &-5110911784191559344
MonoBehaviour:
m_ObjectHideFlags: 1
@@ -481,6 +482,22 @@ MonoBehaviour:
m_Markers:
m_Objects: []
m_PostPlaybackState: 3
+--- !u!114 &-4014953205073901743
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 15c38f6fa1940124db1ab7f6fe7268d1, type: 3}
+ m_Name: Signal Emitter
+ m_EditorClassIdentifier:
+ m_Time: 4.4
+ m_Retroactive: 0
+ m_EmitOnce: 0
+ m_Asset: {fileID: 11400000, guid: 1508e534c5cd88d459d245dd3557a1c6, type: 2}
--- !u!114 &-3778923492680292889
MonoBehaviour:
m_ObjectHideFlags: 1
diff --git a/Assets/MyGame/Scripts/Characters/Monster/MonsterContral.cs b/Assets/MyGame/Scripts/Characters/Monster/MonsterContral.cs
index 443416ac4..34920852b 100644
--- a/Assets/MyGame/Scripts/Characters/Monster/MonsterContral.cs
+++ b/Assets/MyGame/Scripts/Characters/Monster/MonsterContral.cs
@@ -133,6 +133,57 @@ public class MonsterContral : MonoBehaviour
/// 冰冻特效(预制体内子物体,null 则跳过)
public GameObject bingDongEffect;
+ [Header("锁定控制(可选)")]
+ [Tooltip("是否需要锁定事件控制。默认false=一直可锁定;true=出场/切换状态期间不可锁定,需调用 NotifyLockable() 后才可锁定")]
+ public bool needLockEvent = false;
+ ///
+ /// 当前是否可锁定。
+ /// - needLockEvent=false → 一直 true
+ /// - needLockEvent=true → 初始 false,等 NotifyLockable() 调用后变 true
+ /// ⭐ 用于嫦娥(出场→移动两步)和小白龙(多动画片段切换)等特殊鱼
+ ///
+ [System.NonSerialized]
+ public bool isLockable = true;
+ /// 可锁定事件:needLockEvent=true 的鱼首次可锁定时触发,GameMainPanel 订阅用于自动锁定
+ public event Action OnLockable;
+
+ ///
+ /// 通知此鱼现在可以锁定了。needLockEvent=true 的鱼在出场结束/状态切换完成时调用。
+ ///
+ public void NotifyLockable()
+ {
+ if (!isLockable)
+ {
+ isLockable = true;
+ OnLockable?.Invoke(this);
+ }
+ }
+
+ ///
+ /// 切换锁定点(不切换锁定对象)。
+ /// ⭐ 用于小白龙等切换模型/动画片段后锁定点也随之变化的情况:
+ /// 重新从 colliderList 找第一个激活的碰撞器,更新为新的锁定锚点。
+ /// 如果当前没有被锁定则不做任何事。
+ /// 调用方(GameMainPanel_FishBase)负责更新 monCotl_Lock_Position。
+ ///
+ public Transform SwitchLockPoint()
+ {
+ // 优先用 lockPoint(若激活)
+ if (lockPoint != null && lockPoint.gameObject.activeInHierarchy)
+ return lockPoint;
+ // 其次 colliderList 第一个激活的
+ if (colliderList != null)
+ {
+ for (int i = 0; i < colliderList.Count; i++)
+ {
+ var col = colliderList[i];
+ if (col != null && col.gameObject.activeInHierarchy)
+ return col;
+ }
+ }
+ return null;
+ }
+
[Header("创建视频(可选)")]
[Tooltip("鱼创建时播放的入场视频片段,播放结束后才开始移动。为空则无入场视频。播放控件由 GameMainPanel_FishBase 提供")]
public UnityEngine.Video.VideoClip createVideoClip;
@@ -178,6 +229,9 @@ public class MonsterContral : MonoBehaviour
// (金龙/雷龙/玉龙等不走路径,直到爆奖结束销毁)
// - 冰冻中重新激活的鱼,末尾会覆盖为 false,安全
isMove = baseMmove;
+ // ⭐ 重置可锁定状态:needLockEvent=true 的鱼每次重新生成都需等 NotifyLockable()
+ // needLockEvent=false 的鱼一直可锁定
+ isLockable = !needLockEvent;
fishenum = (FishTypeEnum)monsterData.fishTypeConfig.fishType;
uirootRect = UIManager.Instance.uiRoot.GetComponent();
mainCamera = Camera.main;
diff --git a/Assets/MyGame/aa/Game/HHWK/Boss/ChangE/Game177_changE.prefab b/Assets/MyGame/aa/Game/HHWK/Boss/ChangE/Game177_changE.prefab
index 908d65dae..1ff7b3ab2 100644
--- a/Assets/MyGame/aa/Game/HHWK/Boss/ChangE/Game177_changE.prefab
+++ b/Assets/MyGame/aa/Game/HHWK/Boss/ChangE/Game177_changE.prefab
@@ -9104,6 +9104,7 @@ MonoBehaviour:
colliderList: []
lockPoint: {fileID: 4554058763060762538}
bingDongEffect: {fileID: 0}
+ needLockEvent: 1
createVideoClip: {fileID: 0}
rotationPY: 60
baseMmove: 0
@@ -9139,6 +9140,7 @@ MonoBehaviour:
m_Events:
m_Signals:
- {fileID: 11400000, guid: aca498d52b11314418047bc8d6c097ae, type: 2}
+ - {fileID: 11400000, guid: 1508e534c5cd88d459d245dd3557a1c6, type: 2}
m_Events:
- m_PersistentCalls:
m_Calls:
@@ -9154,6 +9156,20 @@ MonoBehaviour:
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
+ - m_PersistentCalls:
+ m_Calls:
+ - m_Target: {fileID: -4443415698351952861}
+ m_TargetAssemblyTypeName: MonsterContral, Assembly-CSharp
+ m_MethodName: NotifyLockable
+ m_Mode: 1
+ m_Arguments:
+ m_ObjectArgument: {fileID: 0}
+ m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+ m_IntArgument: 0
+ m_FloatArgument: 0
+ m_StringArgument:
+ m_BoolArgument: 0
+ m_CallState: 2
--- !u!4 &8404289391009943219 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 9193290778677533018, guid: 530ddf8254beee94d8c4e703be2b9d5a,
diff --git a/Assets/MyGame/aa/Game/HHWK/Boss/XiaoBaiLong/Game177_lm.prefab b/Assets/MyGame/aa/Game/HHWK/Boss/XiaoBaiLong/Game177_lm.prefab
index 647a00e6b..d8e74fd37 100644
--- a/Assets/MyGame/aa/Game/HHWK/Boss/XiaoBaiLong/Game177_lm.prefab
+++ b/Assets/MyGame/aa/Game/HHWK/Boss/XiaoBaiLong/Game177_lm.prefab
@@ -6043,7 +6043,7 @@ PrefabInstance:
- target: {fileID: 9054138907369387089, guid: b91d0e921164f564a98591ba27f3c976,
type: 3}
propertyPath: m_IsActive
- value: 0
+ value: 1
objectReference: {fileID: 0}
- target: {fileID: 9054138907369387089, guid: b91d0e921164f564a98591ba27f3c976,
type: 3}
@@ -6416,6 +6416,7 @@ MonoBehaviour:
- {fileID: 7948326288892304304}
lockPoint: {fileID: 5912107150996647921}
bingDongEffect: {fileID: 0}
+ needLockEvent: 0
createVideoClip: {fileID: 0}
rotationPY: 60
baseMmove: 0
@@ -6451,6 +6452,7 @@ MonoBehaviour:
m_Events:
m_Signals:
- {fileID: 11400000, guid: 344d1087c2077664ebcfebc51d6cf167, type: 2}
+ - {fileID: 11400000, guid: 1508e534c5cd88d459d245dd3557a1c6, type: 2}
m_Events:
- m_PersistentCalls:
m_Calls:
@@ -6466,6 +6468,20 @@ MonoBehaviour:
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
+ - m_PersistentCalls:
+ m_Calls:
+ - m_Target: {fileID: -5726270541466914224}
+ m_TargetAssemblyTypeName: MonsterContral, Assembly-CSharp
+ m_MethodName: NotifyLockable
+ m_Mode: 1
+ m_Arguments:
+ m_ObjectArgument: {fileID: 0}
+ m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+ m_IntArgument: 0
+ m_FloatArgument: 0
+ m_StringArgument:
+ m_BoolArgument: 0
+ m_CallState: 2
--- !u!1 &4531039871979999961 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 9039544429776575319, guid: b91d0e921164f564a98591ba27f3c976,
diff --git a/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs b/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs
index 5bdc41e1c..a73f6c780 100644
--- a/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs
+++ b/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs
@@ -1408,7 +1408,7 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
}
}
- if (targetMonster != null)
+ if (targetMonster != null && targetHitPos != null)
{
// 朝目标发射
Vector3 targetWorldPos = targetHitPos.position;
@@ -1596,15 +1596,18 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
}
///
- /// ⭐ 判断鱼是否有激活的锁定锚点(lockPoint 或 colliderList 中任一碰撞器)。
- /// 鱼出场效果期间 lockPoint 和 collider 都未激活 → 不可锁定,应换一条鱼。
+ /// ⭐ 判断鱼是否可锁定。
+ /// - needLockEvent=false 的鱼:一直可锁定(只要 activeInHierarchy)
+ /// - needLockEvent=true 的鱼:出场/状态切换期间 isLockable=false,等 NotifyLockable() 后才可锁定
+ /// 同时要求有激活的锁定锚点(lockPoint 或 colliderList 任一激活)
///
- private bool HasActiveLockPoint(MonsterContral monster)
+ private bool IsMonsterLockable(MonsterContral monster)
{
- if (monster == null) return false;
- // lockPoint 激活
+ if (monster == null || !monster.gameObject.activeInHierarchy) return false;
+ // ⭐ 可锁定事件控制:needLockEvent=true 的鱼未触发 NotifyLockable 前不可锁定
+ if (!monster.isLockable) return false;
+ // ⭐ 锚点激活检查:lockPoint 或 colliderList 任一激活
if (monster.lockPoint != null && monster.lockPoint.gameObject.activeInHierarchy) return true;
- // colliderList 任一激活
if (monster.colliderList != null)
{
for (int i = 0; i < monster.colliderList.Count; i++)
@@ -1717,8 +1720,8 @@ 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;
+ // ⭐ 可锁定过滤:出场效果期间/needLockEvent 鱼未就绪 → 跳过换下一条
+ if (!IsMonsterLockable(m)) continue;
// ⭐ 统一用 ResolveLockTransform:lockPoint → colliderList → (null则不选)
Transform pos = ResolveLockTransform(m);
@@ -1830,6 +1833,15 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
{
if (!sit.isLock || sit.monCotl_Lock == null) continue;
+ // ⭐ 切换锁定点(小白龙等切换模型后锁定点失效):
+ // 当前 monCotl_Lock_Position 失效 → 调 SwitchLockPoint 重新取激活的锚点
+ if (sit.monCotl_Lock_Position == null || !sit.monCotl_Lock_Position.gameObject.activeInHierarchy)
+ {
+ Transform newLockPos = sit.monCotl_Lock.SwitchLockPoint();
+ if (newLockPos != null)
+ sit.monCotl_Lock_Position = newLockPos;
+ }
+
// 更新主锁定图标
UpdateSingleLockFX(sit, sit.monCotl_Lock, sit.monCotl_Lock_Position, sit.lockFX);
@@ -1844,6 +1856,16 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
var monster = sit.tripleLockTargets[targetIdx];
var hitPos = sit.tripleLockPositions[targetIdx];
if (icon == null || monster == null) continue;
+ // ⭐ 同样为三发目标切换锁定点
+ if (hitPos == null || !hitPos.gameObject.activeInHierarchy)
+ {
+ Transform newLockPos = monster.SwitchLockPoint();
+ if (newLockPos != null)
+ {
+ sit.tripleLockPositions[targetIdx] = newLockPos;
+ hitPos = newLockPos;
+ }
+ }
UpdateSingleLockFX(sit, monster, hitPos, icon);
}
}
@@ -2000,8 +2022,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;
+ // ⭐ 可锁定过滤:出场效果期间/needLockEvent 鱼未就绪 → 跳过换下一条
+ if (!IsMonsterLockable(m)) continue;
int pri = GetFishLockPriority(m);