using System; using System.Collections.Generic; using UnityEngine; /// /// 弹射型子弹曲线:依次弹射到 HurtList 的每个目标,每次弹射飞行时间固定为0.2秒 /// public class BounceBulletCurve : BulletCurve { private List hurtList; private int curIndex = 0; private Vector2 start; private Vector2 end; private float bounceTime = 0.2f; // 每次弹射时间 private float bounceElapsed = 0f; public BounceBulletCurve(BattleObject caster, SkillConfig skillConfig, BattleEffectPlayer effectPlayer, RectTransform target, List hurtList, int bulletIndex, Action> onHit) : base(caster, skillConfig, effectPlayer, target, hurtList, bulletIndex, onHit) { this.hurtList = hurtList; } public override void Reset() { base.Reset(); curIndex = 0; bounceElapsed = 0f; if (hurtList.Count > 0) { start = WorldToLocalAnchoredPosition(bulletTrans.position) + bulletOffset; end = WorldToLocalAnchoredPosition(target.position); duration = Vector2.Distance(start, end) / skillConfig.BulletFlySpeed; } } public override void Run() { if (finished || hurtList.Count == 0) return; bounceElapsed += Time.deltaTime; float t = Mathf.Clamp01(bounceElapsed / bounceTime); Vector2 pos = Vector2.Lerp(start, end, t) + Vector2.up * Mathf.Sin(t * Mathf.PI) * 50f; bulletTrans.anchoredPosition = pos; Vector2 dir = end - start; float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg - 90f; bulletTrans.localRotation = Quaternion.Euler(0, 0, angle); if (t >= 1f) { // 命中当前目标 onHit?.Invoke(mBulletIndex, hurtList); curIndex++; if (curIndex >= hurtList.Count) { finished = true; return; } // 下一段弹射 start = end; var nextTargetObj = caster.battleField.battleObjMgr.GetBattleObject((int)hurtList[curIndex].ObjID); if (nextTargetObj != null && !nextTargetObj.IsDead()) { end = WorldToLocalAnchoredPosition(nextTargetObj.heroRectTrans.position); } else { BattleDebug.LogError("弹射找不到下一个目标 或者只有一个目标"); // 如果目标丢失,直接用上一个end end = start; } bounceElapsed = 0f; } } }