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)
{
end = WorldToLocalAnchoredPosition(nextTargetObj.heroGo.transform.position);
}
else
{
Debug.LogError("弹射找不到下一个目标");
// 如果目标丢失,直接用上一个end
end = start;
}
bounceElapsed = 0f;
}
}
}