using System; using System.Collections.Generic; using UnityEngine; public class StraightBulletCurve : BulletCurve { private Vector2 start; private Vector2 end; public StraightBulletCurve(BattleObject caster, SkillConfig skillConfig, BattleEffectPlayer bulletEffect, RectTransform target, List hurtList, int bulletIndex, Action> onHit) : base(caster, skillConfig, bulletEffect, target, hurtList, bulletIndex, onHit) { } public override void Reset() { base.Reset(); start = WorldToLocalAnchoredPosition(bulletTrans.position) + bulletOffset; end = WorldToLocalAnchoredPosition(target.position); duration = Vector2.Distance(start, end) / skillConfig.BulletFlySpeed; // BattleUtility.MarkStartAndEnd(bulletTrans, target); } public override void Run() { if (finished) return; if (bulletTrans == null) { Debug.LogError("BulletTrans is null, cannot run StraightBulletCurve"); } elapsed += Time.deltaTime; float t = Mathf.Clamp01(elapsed / duration); Vector2 pos = Vector2.Lerp(start, end, t); if (null != bulletTrans) { bulletTrans.anchoredPosition = pos; } Vector2 dir = end - start; float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg + (caster.Camp == BattleCamp.Red ? 0 : 180); if (null != bulletTrans) { bulletTrans.rotation = Quaternion.Euler(0, 0, angle); } if (t >= 1f) { finished = true; onHit?.Invoke(mBulletIndex, hurts); } } }