using System.Collections; using Cielonos.MainGame.Buffs.Character; using Cielonos.MainGame.Characters; using Cielonos.MainGame.UI; using Lean.Pool; using UnityEngine; namespace Cielonos.MainGame.Inventory.Collection { public partial class ThermalDetonator : SupportEquipmentBase { private const float DescentDuration = 4f; private const float SpawnHeight = 24f; } public partial class ThermalDetonator { public override void OnPress() { if (!functionSm.mainFunction.IsAvailable()) { PlayerCanvas.SupportEquipmentsUIArea[this].CanNotUseOutlineAnimation(); return; } CharacterBase target = CombatManager.EnemySm.GetBestEnemyWithLockonFirst(50f); if (target == null) { PlayerCanvas.SupportEquipmentsUIArea[this].NoTargetOutlineAnimation(); return; } Vector3 groundPosition = target.transform.position; StartCoroutine(DetonatorSequence(groundPosition)); functionSm.mainFunction.Execute(); PlayerCanvas.SupportEquipmentsUIArea[this].UseOutlineAnimation(); } } public partial class ThermalDetonator { /// /// 获取最优目标:优先返回锁定目标,其次返回最近敌人。 /// private CharacterBase GetOptimalTarget() { LockTargetSubmodule lockModule = player.viewSc.lockTargetModule; if (lockModule.isLocking && lockModule.lockTarget != null) { return lockModule.lockTarget; } return CombatManager.EnemySm.GetBestEnemy(25f); } /// /// 热爆弹完整序列:生成 indicator → 生成并下落 sphere → 爆炸。 /// private IEnumerator DetonatorSequence(Vector3 groundPosition) { GameObject indicatorInstance = vfxData.SpawnVFX("Indicator", player, groundPosition, Quaternion.identity); Vector3 sphereEndPosition = groundPosition + Vector3.up * 2f; Vector3 sphereStartPosition = groundPosition + Vector3.up * (SpawnHeight + 2); GameObject sphereInstance = vfxData.SpawnVFX("Sphere", player, sphereStartPosition, Quaternion.identity); float elapsed = 0f; while (elapsed < DescentDuration) { elapsed += player.selfTimeSm.DeltaTime; float t = Mathf.Clamp01(elapsed / DescentDuration); sphereInstance.transform.position = Vector3.Lerp(sphereStartPosition, sphereEndPosition, t); yield return null; } LeanPool.Despawn(sphereInstance); GenerateExplosion(sphereEndPosition); } /// /// 在指定位置生成爆炸区域,造成伤害并施加 Burn。 /// private void GenerateExplosion(Vector3 position) { GameObject explosionInstance = vfxData.SpawnVFX("Explosion", player, position, Quaternion.identity); NormalArea blastArea = explosionInstance.GetComponentInChildren(); blastArea.Initialize(player, this, Fraction.Enemy) .SetAttackSubmodule(attackData["Explosion"]) .SetTimeSubmodule(1f, 0f) .SetHitSubmodule(); int burnStack = attackData["Explosion"].GetSubmodule().GetParameter("Buff_Burn_Stack"); blastArea.hitSm.AddHitEvent((hitTarget, hitPosition) => { new Burn(burnStack).Apply(hitTarget, player, this); }); } } }