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