diff --git a/Assets/MyGame/Scripts/Turret/SitPosData.cs b/Assets/MyGame/Scripts/Turret/SitPosData.cs index c3c8f5dca..7dc7c31be 100644 --- a/Assets/MyGame/Scripts/Turret/SitPosData.cs +++ b/Assets/MyGame/Scripts/Turret/SitPosData.cs @@ -65,7 +65,10 @@ public class SitPosData : MonoBehaviour public MonsterContral monCotl_Lock; public Transform monCotl_Lock_Position; public bool isLock = false; - public GameObject lockFX; + public GameObject lockFX; // 主锁定图标(单发/双倍用) + public List lockFX_Triple = new List(); // 三发锁定额外2个图标 + public List tripleLockTargets = new List(); + public List tripleLockPositions = new List(); // ------------------------- // UI @@ -261,6 +264,77 @@ public class SitPosData : MonoBehaviour monCotl_Lock_Position = hitPos; isLock = monster != null; lockFX.SetActive(isLock); + + // 非三发锁定 → 隐藏额外图标 + if (!isLock) HideTripleLockIcons(); + } + + /// + /// 设置三发锁定目标(3个目标分别追踪) + /// + public void SetTripleLockTargets(List<(MonsterContral monster, Transform hitPos)> targets) + { + if (targets == null || targets.Count == 0) + { + HideTripleLockIcons(); + return; + } + + // 确保 lockFX_Triple 有2个克隆的图标(+主图标=3个) + EnsureTripleLockIcons(); + + tripleLockTargets.Clear(); + tripleLockPositions.Clear(); + + // 第一个目标用主 lockFX + var primary = targets[0]; + monCotl_Lock = primary.monster; + monCotl_Lock_Position = primary.hitPos; + isLock = true; + lockFX.SetActive(true); + tripleLockTargets.Add(primary.monster); + tripleLockPositions.Add(primary.hitPos); + + // 第二个和第三个目标用 lockFX_Triple + for (int i = 1; i < targets.Count && i < 3; i++) + { + int idx = i - 1; + if (idx < lockFX_Triple.Count && lockFX_Triple[idx] != null) + { + lockFX_Triple[idx].SetActive(true); + tripleLockTargets.Add(targets[i].monster); + tripleLockPositions.Add(targets[i].hitPos); + } + } + + // 隐藏多余的 + for (int i = targets.Count - 1; i < lockFX_Triple.Count; i++) + { + if (lockFX_Triple[i] != null) + lockFX_Triple[i].SetActive(false); + } + } + + private void EnsureTripleLockIcons() + { + while (lockFX_Triple.Count < 2 && lockFX != null) + { + var clone = GameObject.Instantiate(lockFX, lockFX.transform.parent); + clone.name = lockFX.name + "_Triple" + (lockFX_Triple.Count + 1); + clone.transform.localScale = lockFX.transform.localScale * 0.5f; + lockFX_Triple.Add(clone); + } + } + + public void HideTripleLockIcons() + { + foreach (var icon in lockFX_Triple) + { + if (icon != null) + icon.SetActive(false); + } + tripleLockTargets.Clear(); + tripleLockPositions.Clear(); } public void ClearLock() @@ -269,6 +343,7 @@ public class SitPosData : MonoBehaviour monCotl_Lock_Position = null; isLock = false; lockFX.SetActive(false); + HideTripleLockIcons(); ChangeState(TurretState.Idle); } } diff --git a/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs b/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs index 067f316a9..98332f55c 100644 --- a/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs +++ b/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs @@ -445,6 +445,7 @@ public class GameMainPanel_FishBase : GameMainPanel_Base HandleAutoFire(); // 自动开火真正发射 HandleLock(); UpdateLockFX(); + RefreshTripleLockIcons(); HandleAutoLock(); LoopLaser(); @@ -1143,6 +1144,28 @@ public class GameMainPanel_FishBase : GameMainPanel_Base #endregion #region 锁定系统(LockModule) + /// + /// 刷新三发锁定图标:三发+锁定开启时显示3个锁定圈 + /// + private void RefreshTripleLockIcons() + { + if (currSitData == null) return; + + bool isTripleLock = toggle_Three.isOn && toggle_Lock.isOn && currSitData.isLock; + if (!isTripleLock) + { + currSitData.HideTripleLockIcons(); + return; + } + + // 已经有三发目标 → 跳过 + if (currSitData.tripleLockTargets.Count > 0) return; + + var targets = FindFireTargets(3); + if (targets.Count > 0) + currSitData.SetTripleLockTargets(targets); + } + //private void HandleLock() //{ // CrossPlatformInput input = GetInput(); @@ -1238,48 +1261,65 @@ public class GameMainPanel_FishBase : GameMainPanel_Base foreach (var sit in list_Sits) { if (!sit.isLock || sit.monCotl_Lock == null) continue; - Vector3 pos = Vector3.zero; - if (!sit.monCotl_Lock_Position.gameObject.activeInHierarchy) + // 更新主锁定图标 + UpdateSingleLockFX(sit, sit.monCotl_Lock, sit.monCotl_Lock_Position, sit.lockFX); + + // 更新三发锁定额外图标 + for (int i = 0; i < sit.lockFX_Triple.Count && i < sit.tripleLockTargets.Count; i++) { - if (sit.monCotl_Lock.colliderList != null && sit.monCotl_Lock.colliderList.Count > 0) + var icon = sit.lockFX_Triple[i]; + var monster = sit.tripleLockTargets[i]; + var hitPos = sit.tripleLockPositions[i]; + if (icon == null || monster == null || hitPos == null) continue; + UpdateSingleLockFX(sit, monster, hitPos, icon); + } + } + } + + private void UpdateSingleLockFX(SitPosData sit, MonsterContral monster, Transform hitPos, GameObject icon) + { + Vector3 pos = Vector3.zero; + + if (!hitPos.gameObject.activeInHierarchy) + { + if (monster.colliderList != null && monster.colliderList.Count > 0) + { + bool found = false; + foreach (Transform t in monster.colliderList) { - foreach (Transform t in sit.monCotl_Lock.colliderList) + if (t.gameObject.activeInHierarchy) { - if (t.gameObject.activeInHierarchy) - { - sit.monCotl_Lock_Position = t; - pos = sit.monCotl_Lock_Position.position; - break; - } + pos = t.position; + found = true; + break; } } - else + if (!found) { - // 无 colliderList: 用 lockPoint 兜底 - sit.monCotl_Lock_Position = sit.monCotl_Lock.lockPoint ?? sit.monCotl_Lock.transform; - pos = sit.monCotl_Lock_Position.position; - } - if (!sit.monCotl_Lock_Position.gameObject.activeInHierarchy) - { - if (sit.lockFX.activeSelf) - - sit.lockFX.SetActive(false); + if (icon.activeSelf) icon.SetActive(false); + return; } } else { - pos = sit.monCotl_Lock_Position.position; - if (!sit.lockFX.activeSelf) - sit.lockFX.SetActive(true); + var lp = monster.lockPoint ?? monster.transform; + pos = lp.position; + } + if (!hitPos.gameObject.activeInHierarchy) + { + if (icon.activeSelf) icon.SetActive(false); + return; } - - pos.z = Camera.main.transform.position.z + 1; - - sit.lockFX.transform.position = pos; - - } + else + { + pos = hitPos.position; + if (!icon.activeSelf) icon.SetActive(true); + } + + pos.z = Camera.main.transform.position.z + 1; + icon.transform.position = pos; } private void CheckLockTargetValid() { diff --git a/Assets/MyGame/aa/UI/Game/左下.prefab b/Assets/MyGame/aa/UI/Game/左下.prefab index d58609a88..2df1cc2da 100644 --- a/Assets/MyGame/aa/UI/Game/左下.prefab +++ b/Assets/MyGame/aa/UI/Game/左下.prefab @@ -1328,6 +1328,9 @@ MonoBehaviour: monCotl_Lock_Position: {fileID: 0} isLock: 0 lockFX: {fileID: 8529218940359093989} + lockFX_Triple: [] + tripleLockTargets: [] + tripleLockPositions: [] btn_TurretAdd: {fileID: 6252942356234709792} btn_TurretMinus: {fileID: 1312082037330290505} --- !u!1001 &1674375458163684072 @@ -1344,15 +1347,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4422993899914191, guid: da3b8d5eaa616f74cb4bb14f21d152da, type: 3} propertyPath: m_LocalScale.x - value: 1 + value: 2 objectReference: {fileID: 0} - target: {fileID: 4422993899914191, guid: da3b8d5eaa616f74cb4bb14f21d152da, type: 3} propertyPath: m_LocalScale.y - value: 1 + value: 2 objectReference: {fileID: 0} - target: {fileID: 4422993899914191, guid: da3b8d5eaa616f74cb4bb14f21d152da, type: 3} propertyPath: m_LocalScale.z - value: 1 + value: 2 objectReference: {fileID: 0} - target: {fileID: 4422993899914191, guid: da3b8d5eaa616f74cb4bb14f21d152da, type: 3} propertyPath: m_LocalPosition.x @@ -1442,15 +1445,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4221933748538500, guid: f273977339d68454382ad04db250e1ab, type: 3} propertyPath: m_LocalScale.x - value: 1 + value: 2 objectReference: {fileID: 0} - target: {fileID: 4221933748538500, guid: f273977339d68454382ad04db250e1ab, type: 3} propertyPath: m_LocalScale.y - value: 1 + value: 2 objectReference: {fileID: 0} - target: {fileID: 4221933748538500, guid: f273977339d68454382ad04db250e1ab, type: 3} propertyPath: m_LocalScale.z - value: 1 + value: 2 objectReference: {fileID: 0} - target: {fileID: 4221933748538500, guid: f273977339d68454382ad04db250e1ab, type: 3} propertyPath: m_LocalPosition.x diff --git a/Assets/MyGame/aa/UI/Home/Sub/SelectRoomPanel.prefab b/Assets/MyGame/aa/UI/Home/Sub/SelectRoomPanel.prefab index d58af33fb..f236edd00 100644 --- a/Assets/MyGame/aa/UI/Home/Sub/SelectRoomPanel.prefab +++ b/Assets/MyGame/aa/UI/Home/Sub/SelectRoomPanel.prefab @@ -2549,7 +2549,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!224 &6453153804364342009 RectTransform: m_ObjectHideFlags: 0 @@ -3456,7 +3456,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!224 &6443825343461815266 RectTransform: m_ObjectHideFlags: 0 @@ -4581,9 +4581,9 @@ RectTransform: - {fileID: 796498848773345856} m_Father: {fileID: 6640197946060080782} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 843.0013, y: -59.5} m_SizeDelta: {x: 241, y: 57} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &1824513194272848321 @@ -19983,9 +19983,9 @@ RectTransform: - {fileID: 838507831760552503} m_Father: {fileID: 6640197946060080782} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 521.5813, y: -59.5} m_SizeDelta: {x: 237, y: 70} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &4732889502887017558 @@ -21367,9 +21367,9 @@ RectTransform: - {fileID: 5272030444220040528} m_Father: {fileID: 5271252458329279066} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 843.0013, y: -59.5} m_SizeDelta: {x: 241, y: 57} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &8474446218469619674 @@ -23435,9 +23435,9 @@ RectTransform: - {fileID: 1302658281916278134} m_Father: {fileID: 5271252458329279066} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 175.33064, y: -59.5} m_SizeDelta: {x: 290.6613, y: 100} m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &4430329704700203055 @@ -24567,9 +24567,9 @@ RectTransform: - {fileID: 1578518544669093433} m_Father: {fileID: 6640197946060080782} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 175.33064, y: -59.5} m_SizeDelta: {x: 290.6613, y: 100} m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &4991136523867227728 @@ -24942,9 +24942,9 @@ RectTransform: - {fileID: 8314237941475532380} m_Father: {fileID: 5271252458329279066} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 521.5813, y: -59.5} m_SizeDelta: {x: 237, y: 70} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &2378775281535466951