using System;
|
using System.Collections.Generic;
|
using UnityEngine;
|
|
public class BulletCurve
|
{
|
protected BattleObject caster;
|
protected SkillConfig skillConfig;
|
protected BattleEffectPlayer bulletEffect;
|
protected RectTransform bulletTrans; // 子弹的RectTransform
|
protected RectTransform target;
|
protected Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHit;
|
|
protected bool finished = false;
|
protected float duration = 0f;
|
protected float elapsed = 0f;
|
|
public BulletCurve() { }
|
|
public BulletCurve(BattleObject caster, SkillConfig skillConfig, BattleEffectPlayer bulletEffect, RectTransform target, Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHit)
|
{
|
this.caster = caster;
|
this.skillConfig = skillConfig;
|
this.bulletEffect = bulletEffect;
|
this.target = target;
|
this.onHit = onHit;
|
this.bulletTrans = bulletEffect.transform as RectTransform;
|
}
|
|
public virtual void Reset()
|
{
|
finished = false;
|
elapsed = 0f;
|
duration = skillConfig.BulletFlyTime;
|
}
|
|
// 世界坐标转为bulletTrans父节点下的本地坐标
|
protected Vector2 WorldToLocalAnchoredPosition(Vector3 worldPos)
|
{
|
var parent = bulletTrans.parent as RectTransform;
|
Vector2 localPoint;
|
RectTransformUtility.ScreenPointToLocalPointInRectangle(parent, RectTransformUtility.WorldToScreenPoint(null, worldPos), null, out localPoint);
|
return localPoint;
|
}
|
|
// Run就是Update,每帧调用
|
public virtual void Run()
|
{
|
if (finished) return;
|
Vector2 targetPos = WorldToLocalAnchoredPosition(target.position);
|
bulletTrans.anchoredPosition = targetPos;
|
ReachTarget();
|
}
|
|
protected virtual void ReachTarget()
|
{
|
finished = true;
|
onHit?.Invoke(0, null);
|
caster.battleField.battleEffectMgr.RemoveEffect(skillConfig.BulletEffectId, bulletEffect);
|
}
|
|
public bool IsFinished => finished;
|
}
|