lcy
2025-11-06 09bc892c7283df8757a07b646d5af21ddaa263d1
Main/System/Battle/SkillEffect/BulletSkillEffect.cs
@@ -12,6 +12,10 @@
    // protected List<BattleObject> targets; // 目标列表
    protected List<BulletCurve> bulletCurves = new List<BulletCurve>();
    // 散射技能击中计数器,用于判断是否所有目标都已击中
    private int scatterHitCount = 0;
    private int scatterTotalTargets = 0;
    public BulletSkillEffect(SkillConfig _skillConfig, BattleObject _caster, HB427_tagSCUseSkill _tagUseSkillAttack)
@@ -19,6 +23,7 @@
    {
    }
    public override void OnMiddleFrameEnd(int times, int index)
@@ -43,7 +48,7 @@
            if (skillConfig.Scattering == 1)
            {
                //  散射
                ShotEachTargets(index);
                ScatterShot(index);
            }
            else
            {
@@ -89,7 +94,7 @@
        {
            // 若TagCount目标个数为1~5个,代表随机作用于敌方或我方x个武将,此时所有被随机到的对象都为主目标(施法位置会用客户端配置)
            ShotEachTargets(index);
        }
        }
    }
    // 1    对位:
@@ -123,7 +128,7 @@
        BattleCamp battleCamp = skillConfig.TagFriendly != 0 ? caster.Camp : caster.GetEnemyCamp();
        if (skillConfig.TagAffect != 0 && skillConfig.TagAffect != 3 && skillConfig.TagCount < 3)
        if (skillConfig.TagAffect != 0 || skillConfig.TagCount < 3)
        {
            ShotEachTargets(index);
        }
@@ -171,7 +176,7 @@
        RectTransform effectTrans = effectPlayer.transform as RectTransform;
        var bulletCurve = BulletCurveFactory.CreateBulletCurve(caster, skillConfig, effectPlayer, targetTransform, tagUseSkillAttack, bulletIndex, (index, hitList) =>
        var bulletCurve = BulletCurveFactory.CreateBulletCurve(caster, skillConfig, effectPlayer, targetTransform, tagUseSkillAttack.HurtList.ToList(), bulletIndex, (index, hitList) =>
        {
            if (isFinish)
                return;
@@ -194,6 +199,7 @@
                }
                PlayExplosionEffect(skillConfig.ExplosionEffect3, targetObj.heroGo.transform, caster.Camp);
                PlayExplosionEffect(skillConfig.ExplosionEffect4, targetObj.heroGo.transform, caster.Camp);
            }
            // 表现子弹飞行到目标位置
@@ -214,7 +220,7 @@
        BattleCamp battleCamp = skillConfig.TagFriendly != 0 ? caster.Camp : caster.GetEnemyCamp();
        if (skillConfig.TagAffect != 0 && skillConfig.TagAffect != 3 && skillConfig.TagCount < 3)
        if (skillConfig.TagAffect != 0 || skillConfig.TagCount < 3)
        {
            ShotEachTargets(index);
        }
@@ -293,16 +299,46 @@
        ShotToIndex(caster.Camp, caster.teamHero.positionNum, index);
    }
    protected void ShotToTarget(BattleObject target, int bulletIndex)
    //  散射
    private void ScatterShot(int index)
    {
        // 只在第一次发射时初始化散射计数器
        if (index == 0)
        {
            scatterHitCount = 0;
            // 总击中数 = 发射次数 × 目标数量
            scatterTotalTargets = skillConfig.ActiveFrames.Length * tagUseSkillAttack.HurtList.Length;
        }
        // 处理散射逻辑
        for (int i = 0; i < tagUseSkillAttack.HurtList.Length; i++)
        {
            var hurt = tagUseSkillAttack.HurtList[i];
            BattleObject target = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
            if (target == null)
            {
                Debug.LogError("特效目标为空 target == null ObjId : " + hurt.ObjID);
                // 目标为空时减少对应发射次数的总目标数
                if (index == 0) scatterTotalTargets--;
                continue;
            }
            ScatterShot(target, hurt, index, i);
        }
    }
    private void ScatterShot(BattleObject target, HB427_tagSCUseSkill.tagSCUseSkillHurt hurt, int bulletIndex, int order)
    {
        BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.BulletEffectId, caster.heroRectTrans, caster.Camp);
        var bulletCurve = BulletCurveFactory.CreateBulletCurve(caster, skillConfig, effectPlayer, target.heroRectTrans, tagUseSkillAttack, bulletIndex, (index, hitList) =>
        {
            if (isFinish)
                return;
        bool shotToSelf = target.ObjID == caster.ObjID;
        effectPlayer.Alpha = shotToSelf ? 0f : 1f;
        var tempOrder = order;
        var bulletCurve = BulletCurveFactory.CreateBulletCurve(caster, skillConfig, effectPlayer, target.heroRectTrans,
            new List<HB427_tagSCUseSkill.tagSCUseSkillHurt> { hurt }, bulletIndex, (index, hitList) =>
        {
            foreach (var hurt in hitList)
            {
                BattleObject targetObj = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
@@ -315,12 +351,59 @@
                PlayExplosionEffect(skillConfig.ExplosionEffectId, targetObj.heroGo.transform, caster.Camp);
                PlayExplosionEffect(skillConfig.ExplosionEffect2, targetObj.heroGo.transform, caster.Camp);
                PlayExplosionEffect(skillConfig.ExplosionEffect3, targetObj.heroGo.transform, caster.Camp);
                PlayExplosionEffect(skillConfig.ExplosionEffect4, targetObj.heroGo.transform, caster.Camp);
            }
            // 表现子弹飞行到目标位置
            onHit?.Invoke(index, hitList);
            // 击中就销毁子弹
            caster.battleField.battleEffectMgr.RemoveEffect(skillConfig.BulletEffectId, effectPlayer);
            // 增加散射击中计数
            scatterHitCount++;
            // 判断是否所有发射次数的所有目标都已击中
            if (scatterHitCount >= scatterTotalTargets)
            {
                isFinish = true;
            }
        });
        bulletCurves.Add(bulletCurve);
    }
    protected void ShotToTarget(BattleObject target, int bulletIndex)
    {
        BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.BulletEffectId, caster.heroRectTrans, caster.Camp);
        bool shotToSelf = target.ObjID == caster.ObjID;
        effectPlayer.Alpha = shotToSelf ? 0f : 1f;
        var bulletCurve = BulletCurveFactory.CreateBulletCurve(caster, skillConfig, effectPlayer, target.heroRectTrans, tagUseSkillAttack.HurtList.ToList(), bulletIndex, (index, hitList) =>
        {
            foreach (var hurt in hitList)
            {
                BattleObject targetObj = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
                if (targetObj == null)
                {
                    Debug.LogError("目标为空 target == null ObjId : " + hurt.ObjID);
                    continue;
                }
                PlayExplosionEffect(skillConfig.ExplosionEffectId, targetObj.heroGo.transform, caster.Camp);
                PlayExplosionEffect(skillConfig.ExplosionEffect2, targetObj.heroGo.transform, caster.Camp);
                PlayExplosionEffect(skillConfig.ExplosionEffect3, targetObj.heroGo.transform, caster.Camp);
                PlayExplosionEffect(skillConfig.ExplosionEffect4, targetObj.heroGo.transform, caster.Camp);
            }
            // 表现子弹飞行到目标位置
            onHit?.Invoke(index, hitList);
            // 击中就销毁子弹
            caster.battleField.battleEffectMgr.RemoveEffect(skillConfig.BulletEffectId, effectPlayer);
            if (isFinish)
                return;
            if (bulletIndex >= skillConfig.ActiveFrames.Length - 1)
            {
@@ -383,7 +466,7 @@
    public override bool IsFinished()
    {
        bool isCurveFinish = false;
        bool isCurveFinish = bulletCurves.Count <= 0;
        foreach (var bulletCurve in bulletCurves)
        {