using System; 
 | 
using System.Collections.Generic; 
 | 
using UnityEngine; 
 | 
  
 | 
public class PenetrateBulletCurve : BulletCurve 
 | 
{ 
 | 
    private Vector2 start;      // 子弹起点(本地坐标) 
 | 
    private Vector2 end;        // 目标点(本地坐标) 
 | 
    private Vector2 outPos;     // 屏幕外延长点(本地坐标) 
 | 
    private bool hitTriggered = false; // 是否已触发onHit 
 | 
  
 | 
    public PenetrateBulletCurve(BattleObject caster, SkillConfig skillConfig, BattleEffectPlayer effectPlayer, RectTransform target, List<HB427_tagSCUseSkill.tagSCUseSkillHurt> hurtList, int bulletIndex, Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHit) 
 | 
        : base(caster, skillConfig, effectPlayer, target, hurtList, bulletIndex, onHit) { } 
 | 
  
 | 
    /// <summary> 
 | 
    /// 初始化弹道参数 
 | 
    /// </summary> 
 | 
    public override void Reset() 
 | 
    { 
 | 
        base.Reset(); 
 | 
        hitTriggered = false; 
 | 
        start = WorldToLocalAnchoredPosition(bulletTrans.position); 
 | 
        end = WorldToLocalAnchoredPosition(target.position); 
 | 
        duration = Vector2.Distance(start, end) / skillConfig.BulletFlySpeed; 
 | 
        Vector2 dir = (end - start).normalized; 
 | 
        float extend = 500f; // 贯穿距离,可根据需求调整 
 | 
        outPos = end + dir * extend; 
 | 
    } 
 | 
  
 | 
    /// <summary> 
 | 
    /// 每帧调用,驱动子弹移动和表现 
 | 
    /// </summary> 
 | 
    public override void Run() 
 | 
    { 
 | 
        if (finished) return; 
 | 
        elapsed += Time.deltaTime; 
 | 
        float t = Mathf.Clamp01(elapsed / duration); 
 | 
  
 | 
        // 贯穿分两段:0~0.5到目标点,0.5~1.0继续飞出 
 | 
        float mid = 0.5f; 
 | 
        Vector2 pos; 
 | 
        if (t < mid) 
 | 
        { 
 | 
            // 前半段:插值到目标点 
 | 
            pos = Vector2.Lerp(start, end, t / mid); 
 | 
        } 
 | 
        else 
 | 
        { 
 | 
            // 后半段:插值到屏幕外 
 | 
            pos = Vector2.Lerp(end, outPos, (t - mid) / (1f - mid)); 
 | 
            // 到达目标点瞬间触发onHit,只触发一次 
 | 
            if (!hitTriggered) 
 | 
            { 
 | 
                hitTriggered = true; 
 | 
                onHit?.Invoke(mBulletIndex, hurts); 
 | 
            } 
 | 
        } 
 | 
        bulletTrans.anchoredPosition = pos; 
 | 
  
 | 
        // 旋转:始终朝向运动方向,子弹默认90°向上 
 | 
        Vector2 dir = (t < mid) ? (end - start) : (outPos - end); 
 | 
        float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg - 90f; 
 | 
        bulletTrans.localRotation = Quaternion.Euler(0, 0, angle); 
 | 
  
 | 
        // 到达终点,结束 
 | 
        if (t >= 1f) 
 | 
        { 
 | 
            finished = true; 
 | 
        } 
 | 
    } 
 | 
} 
 |