yyl
2025-09-12 c5c6c915069a1f93d10ee3d2c897beca1e100c8d
125 战斗 诸葛果 连续普攻问题修复 治疗技能增加
1个文件已删除
16个文件已修改
2个文件已添加
274 ■■■■■ 已修改文件
Main/Component/UI/Common/RendererAdjuster.cs 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Component/UI/Common/RendererAdjuster.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/GameEngine/Login.meta 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/BattleField.cs 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleObject/BattleObject.cs 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Define/DamageType.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Motion/MotionBase.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/RecordPlayer/RecordPlayer.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Skill/DirectlyHealSkill.cs 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Skill/SkillBase.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Skill/SkillFactory.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/SkillEffect/BulletCurve/BezierBulletCurve.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/SkillEffect/BulletCurve/BounceBulletCurve.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/SkillEffect/BulletCurve/BulletCurve.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/SkillEffect/BulletCurve/BulletCurveFactory.cs 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/SkillEffect/BulletCurve/PenetrateBulletCurve.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/SkillEffect/BulletCurve/StraightBulletCurve.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/SkillEffect/BulletSkillEffect.cs 67 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/UIComp/BattleHeroInfoBar.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Component/UI/Common/RendererAdjuster.cs
New file
@@ -0,0 +1,72 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class RendererAdjuster : MonoBehaviour
{
    public int renderQueue = 3000;
    public Canvas canvas;
    public int sortingOrderOffset = 1;
    public string customSortingLayer = "UI";
    public List<Renderer> renderers = new List<Renderer>();
    public void Awake()
    {
        UpdateComps();
    }
    protected void UpdateComps()
    {
        renderers.Clear();
        renderers.AddRange(gameObject.GetComponentsInChildren<Renderer>(true));
        canvas = GetComponentInParent<Canvas>();
    }
    public void SetParentCanvas(Canvas _canvas)
    {
        canvas = _canvas;
        this.DelayFrame(UpdateSortingOrder);
    }
    public void UpdateSortingOrder()
    {
        int canvasSortingOrder = 0;
        // 获取父级Canvas的排序顺序
        if (canvas != null)
        {
            canvasSortingOrder = canvas.sortingOrder;
        }
        else
        {
            // 如果没有找到父级Canvas,则使用默认值
            canvasSortingOrder = 0;
        }
        // 将特效的排序顺序设置为Canvas排序顺序加上偏移量
        ApplySortingSettings(canvasSortingOrder + sortingOrderOffset, customSortingLayer);
    }
    private void ApplySortingSettings(int sortingOrder, string sortingLayer)
    {
        foreach (Renderer renderer in renderers)
        {
            if (renderer != null)
            {
                renderer.sortingOrder = sortingOrder;
                renderer.material.renderQueue = renderQueue; // 设置渲染队列
                // renderer.material.renderQueue = overlayRQ;
                if (!string.IsNullOrEmpty(sortingLayer))
                {
                    renderer.sortingLayerName = sortingLayer;
                }
            }
        }
    }
}
Main/Component/UI/Common/RendererAdjuster.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 75517d945fb16024d9ab09ca21288a01
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/Core/GameEngine/Login.meta
File was deleted
Main/System/Battle/BattleField/BattleField.cs
@@ -372,6 +372,15 @@
                blocker.SetParentCanvas(canvas);
            }
        }
        RendererAdjuster[] adjusters = battleRootNode.GetComponentsInChildren<RendererAdjuster>(true);
        if (null != adjusters)
        {
            foreach (var adjuster in adjusters)
            {
                adjuster.SetParentCanvas(canvas);
            }
        }
    }
    public void StartBattle(Action onMoveComplete)
Main/System/Battle/BattleObject/BattleObject.cs
@@ -84,7 +84,6 @@
        Camp = _camp;
        motionBase = new MotionBase();
        motionBase.Init(heroGo.GetComponentInChildren<SkeletonGraphic>(true));
        motionBase.onAnimationComplete += OnAnimationComplete;
        buffMgr = new BattleObjectBuffMgr();
        buffMgr.Init(this);
@@ -120,7 +119,6 @@
    public virtual void Destroy()
    {
        motionBase.onAnimationComplete -= OnAnimationComplete;
        motionBase.Release();
        motionBase = null;
@@ -319,12 +317,6 @@
            OnDeadAnimationComplete();
            _onDeathAnimationComplete?.Invoke();
        });
    }
    //  不一定可靠 有时候会插入其他动作就完了
    protected virtual void OnAnimationComplete(string motionName)
    {
    }
    protected virtual void OnDeadAnimationComplete()
Main/System/Battle/Define/DamageType.cs
@@ -4,7 +4,6 @@
// 而AttackType一般代表的是本次技能的伤害飘血类型,如普通伤害,暴击伤害、格挡、回血等
// 伤血类型: 1-普通;2-回血;3-反弹;4-流血;5-格挡;7-暴击,9-闪避
//
// 101011111
@@ -15,8 +14,6 @@
{
    Damage = 2,
    Recovery = 4,
    Reflect = 8,
    Bloody = 16,
    Block = 32,
    Crit = 128,
    Dodge = 512
Main/System/Battle/Motion/MotionBase.cs
@@ -24,7 +24,6 @@
    // 动画事件
    public Action OnAttackAnimationComplete;
    public Action OnHitAnimationComplete;
    public Action<string> onAnimationComplete;
    
    private List<Action> runActionList = new List<Action>();
@@ -333,8 +332,6 @@
            OnHitAnimationComplete?.Invoke();
            PlayAnimation(MotionName.idle, true);
        }
        onAnimationComplete?.Invoke(animation);
        
        // 只调用本次TrackEntry的回调
        if (trackEntryCompleteDict.TryGetValue(trackEntry, out var cb))
Main/System/Battle/RecordPlayer/RecordPlayer.cs
@@ -28,7 +28,7 @@
    public void PlayRecord(RecordAction recordAction)
    {
        BattleDebug.LogError("Enqueue record action " + recordAction.GetType());
        // BattleDebug.LogError("Enqueue record action " + recordAction.GetType());
        recordActionQueue.Enqueue(recordAction);
    }
@@ -42,7 +42,7 @@
    public void InsertRecord(RecordAction recordAction)
    {
        BattleDebug.LogError("Insert record action " + recordAction.GetType());
        // BattleDebug.LogError("Insert record action " + recordAction.GetType());
        if (currentRecordAction != null)
        {
            Queue<RecordAction> tempQueue = new Queue<RecordAction>();
@@ -124,7 +124,7 @@
        if (currentRecordAction != null && currentRecordAction.IsFinished())
        {
            BattleDebug.LogError("record action " + currentRecordAction.GetType() + " play finished");
            // BattleDebug.LogError("record action " + currentRecordAction.GetType() + " play finished");
            currentRecordAction = null;
            isWaitingNextAction = true;
            waitTimer = 0f;
@@ -136,7 +136,7 @@
            if (recordActionQueue.Count > 0)
            {
                currentRecordAction = recordActionQueue.Dequeue();
                BattleDebug.LogError("play record action " + currentRecordAction.GetType());
                // BattleDebug.LogError("play record action " + currentRecordAction.GetType());
            }
        }
    }
Main/System/Battle/Skill/DirectlyHealSkill.cs
@@ -6,7 +6,6 @@
public class DirectlyHealSkill : SkillBase
{
    protected SkillEffect skillEffect;
    public DirectlyHealSkill(BattleObject _caster, SkillConfig _skillCfg,
            HB427_tagSCUseSkill _vNetData, List<GameNetPackBasic> _packList, BattleField _battleField)
@@ -16,23 +15,16 @@
    }
    // //    前摇结束
    // public override void OnStartSkillFrameEnd()
    // {
    //     skillEffect = SkillEffectFactory.CreateSkillEffect(
    //             caster,
    //             skillConfig,
    //             tagUseSkillAttack
    //         );
    //     if (skillEffect != null)
    //     {
    //         skillEffect.Play(OnHitTargets);
    //     }
    // }
    protected override void OnHitTargets(int _hitIndex, List<HB427_tagSCUseSkill.tagSCUseSkillHurt> hitList)
    {
        base.OnHitTargets(_hitIndex, hitList);
    }
    // protected override void OnHitTargets(int _healIndex, List<HB427_tagSCUseSkill.tagSCUseSkillHurt> healList)
    // {
    //     base.OnHitTargets(_healIndex, healList);
    // }
    protected override void OnAllAttackMoveFinished()
    {
        base.OnAllAttackMoveFinished();
        OnSkillFinished();
    }
}
Main/System/Battle/Skill/SkillBase.cs
@@ -376,7 +376,7 @@
        HashSet<BattleObject> highlightList = new HashSet<BattleObject>(battleField.battleObjMgr.GetBattleObjList(tagUseSkillAttack));
        highlightList.Add(caster);
        // caster.battleField.skillMask
        //    把这些BO全高亮 或者说把除了这些的都放在遮罩后面
        //    YYL TODO
    }
Main/System/Battle/Skill/SkillFactory.cs
@@ -60,9 +60,9 @@
                //    先实现一个攻击的 后续有再慢慢增加
                skill = new DirectlyDamageSkill(_caster, skillConfig, vNetData, packList, battleField);
                break;
            // case 2:
            //     // skill = new DirectlyHealSkill(_skillConfig);
            //     break;
            case 2:
                skill = new DirectlyHealSkill(_caster, skillConfig, vNetData, packList, battleField);
                break;
            // case 3:
            // case 4:
            // case 5:
Main/System/Battle/SkillEffect/BulletCurve/BezierBulletCurve.cs
@@ -9,8 +9,8 @@
    private Vector2 control;
    public BezierBulletCurve(BattleObject caster, SkillConfig skillConfig, BattleEffectPlayer effectPlayer,
        RectTransform target, HB427_tagSCUseSkill tagUseSkillAttack, Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHit)
        : base(caster, skillConfig, effectPlayer, target, tagUseSkillAttack, onHit) { }
        RectTransform target, HB427_tagSCUseSkill tagUseSkillAttack, int bulletIndex, Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHit)
        : base(caster, skillConfig, effectPlayer, target, tagUseSkillAttack, bulletIndex, onHit) { }
    public override void Reset()
    {
@@ -36,7 +36,7 @@
        if (t >= 1f)
        {
            finished = true;
            onHit?.Invoke(0, hurts);
            onHit?.Invoke(mBulletIndex, hurts);
        }
    }
}
Main/System/Battle/SkillEffect/BulletCurve/BounceBulletCurve.cs
@@ -15,8 +15,8 @@
    private float bounceElapsed = 0f;
    public BounceBulletCurve(BattleObject caster, SkillConfig skillConfig, BattleEffectPlayer effectPlayer,
        RectTransform target, HB427_tagSCUseSkill tagUseSkillAttack, Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHit)
        : base(caster, skillConfig, effectPlayer, target, tagUseSkillAttack, onHit)
        RectTransform target, HB427_tagSCUseSkill tagUseSkillAttack, int bulletIndex, Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHit)
        : base(caster, skillConfig, effectPlayer, target, tagUseSkillAttack, bulletIndex, onHit)
    {
        this.hurtList = new List<HB427_tagSCUseSkill.tagSCUseSkillHurt>(tagUseSkillAttack.HurtList);
    }
@@ -51,7 +51,7 @@
        if (t >= 1f)
        {
            // 命中当前目标
            onHit?.Invoke(curIndex, hurtList);
            onHit?.Invoke(mBulletIndex, hurtList);
            curIndex++;
            if (curIndex >= hurtList.Count)
Main/System/Battle/SkillEffect/BulletCurve/BulletCurve.cs
@@ -16,9 +16,12 @@
    protected float duration = 0f;
    protected float elapsed = 0f;
    protected int mBulletIndex;
    protected List<HB427_tagSCUseSkill.tagSCUseSkillHurt> hurts = new List<HB427_tagSCUseSkill.tagSCUseSkillHurt>();
    public BulletCurve(BattleObject caster, SkillConfig skillConfig, BattleEffectPlayer bulletEffect, RectTransform target, HB427_tagSCUseSkill tagUseSkillAttack, Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHit)
    public BulletCurve(BattleObject caster, SkillConfig skillConfig, BattleEffectPlayer bulletEffect, RectTransform target,
        HB427_tagSCUseSkill tagUseSkillAttack, int bulletIndex, Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHit)
    {
        this.caster = caster;
        this.skillConfig = skillConfig;
@@ -27,6 +30,7 @@
        this.onHit = onHit;
        this.bulletTrans = bulletEffect.transform as RectTransform;
        this.hurts = tagUseSkillAttack.HurtList.ToList();
        this.mBulletIndex = bulletIndex;
        // 设置bulletTrans坐标为caster.heroRectTrans的世界坐标转换到bulletTrans父节点下的本地坐标
        if (bulletTrans != null && caster.heroRectTrans != null)
@@ -69,7 +73,7 @@
    protected virtual void ReachTarget()
    {
        finished = true;
        onHit?.Invoke(0, hurts);
        onHit?.Invoke(mBulletIndex, hurts);
        caster.battleField.battleEffectMgr.RemoveEffect(skillConfig.BulletEffectId, bulletEffect);
    }
Main/System/Battle/SkillEffect/BulletCurve/BulletCurveFactory.cs
@@ -16,25 +16,26 @@
        BattleEffectPlayer bulletEffect,
        RectTransform target,
        HB427_tagSCUseSkill tagUseSkillAttack,
        int bulletIndex,
        Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHit)
    {
        BulletCurve curve = null;
        switch (skillConfig.BulletPath)
        {
            case 1: // 直线消失于目标
                curve = new StraightBulletCurve(caster, skillConfig, bulletEffect, target, tagUseSkillAttack, onHit);
                curve = new StraightBulletCurve(caster, skillConfig, bulletEffect, target, tagUseSkillAttack, bulletIndex, onHit);
                break;
            case 2: // 直线贯穿消失在屏幕外
                curve = new PenetrateBulletCurve(caster, skillConfig, bulletEffect, target, tagUseSkillAttack, onHit);
                curve = new PenetrateBulletCurve(caster, skillConfig, bulletEffect, target, tagUseSkillAttack, bulletIndex, onHit);
                break;
            case 3: // 抛物线弧线
                curve = new BezierBulletCurve(caster, skillConfig, bulletEffect, target, tagUseSkillAttack, onHit);
                curve = new BezierBulletCurve(caster, skillConfig, bulletEffect, target, tagUseSkillAttack, bulletIndex, onHit);
                break;
            case 4: // 弹射
                curve = new BounceBulletCurve(caster, skillConfig, bulletEffect, target, tagUseSkillAttack, onHit);
                curve = new BounceBulletCurve(caster, skillConfig, bulletEffect, target, tagUseSkillAttack, bulletIndex, onHit);
                break;
            default:
                curve = new BulletCurve(caster, skillConfig, bulletEffect, target, tagUseSkillAttack, onHit);
                curve = new BulletCurve(caster, skillConfig, bulletEffect, target, tagUseSkillAttack, bulletIndex, onHit);
                break;
        }
Main/System/Battle/SkillEffect/BulletCurve/PenetrateBulletCurve.cs
@@ -9,8 +9,8 @@
    private Vector2 outPos;     // 屏幕外延长点(本地坐标)
    private bool hitTriggered = false; // 是否已触发onHit
    public PenetrateBulletCurve(BattleObject caster, SkillConfig skillConfig, BattleEffectPlayer effectPlayer, RectTransform target, HB427_tagSCUseSkill tagUseSkillAttack, Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHit)
        : base(caster, skillConfig, effectPlayer, target, tagUseSkillAttack, onHit) { }
    public PenetrateBulletCurve(BattleObject caster, SkillConfig skillConfig, BattleEffectPlayer effectPlayer, RectTransform target, HB427_tagSCUseSkill tagUseSkillAttack, int bulletIndex, Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHit)
        : base(caster, skillConfig, effectPlayer, target, tagUseSkillAttack, bulletIndex, onHit) { }
    /// <summary>
    /// 初始化弹道参数
@@ -52,7 +52,7 @@
            if (!hitTriggered)
            {
                hitTriggered = true;
                onHit?.Invoke(0, hurts);
                onHit?.Invoke(mBulletIndex, hurts);
            }
        }
        bulletTrans.anchoredPosition = pos;
Main/System/Battle/SkillEffect/BulletCurve/StraightBulletCurve.cs
@@ -7,9 +7,9 @@
    private Vector2 start;
    private Vector2 end;
    public StraightBulletCurve(BattleObject caster, SkillConfig skillConfig, BattleEffectPlayer bulletEffect, RectTransform target, HB427_tagSCUseSkill tagUseSkillAttack, Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHit)
        : base(caster, skillConfig, bulletEffect, target, tagUseSkillAttack, onHit)
    {
    public StraightBulletCurve(BattleObject caster, SkillConfig skillConfig, BattleEffectPlayer bulletEffect, RectTransform target, HB427_tagSCUseSkill tagUseSkillAttack, int bulletIndex, Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHit)
        : base(caster, skillConfig, bulletEffect, target, tagUseSkillAttack, bulletIndex, onHit)
    {
    }
@@ -50,7 +50,7 @@
        if (t >= 1f)
        {
            finished = true;
            onHit?.Invoke(0, hurts);
            onHit?.Invoke(mBulletIndex, hurts);
        }
    }
}
Main/System/Battle/SkillEffect/BulletSkillEffect.cs
@@ -13,6 +13,7 @@
    protected List<BulletCurve> bulletCurves = new List<BulletCurve>();
    public BulletSkillEffect(SkillConfig _skillConfig, BattleObject _caster, HB427_tagSCUseSkill _tagUseSkillAttack)
        : base(_skillConfig, _caster, _tagUseSkillAttack)
    {
@@ -33,7 +34,7 @@
                Debug.LogError("目标为空 target == null ObjId : " + hurt.ObjID);
                return;
            }
            ShotToTarget(targetObject);
            ShotToTarget(targetObject, index);
        }
        //  普通的做法 区分打向阵营或者打向个体
        else
@@ -42,29 +43,29 @@
            if (skillConfig.Scattering == 1)
            {
                //  散射
                ShotEachTargets();
                ShotEachTargets(index);
            }
            else
            {
                switch (skillConfig.TagAim)
                {
                    case 0:
                        AllAreaShoting();
                        AllAreaShoting(index);
                        break;
                    case 1:
                        OneTargetShoting();
                        OneTargetShoting(index);
                        break;
                    case 2:
                        FrontRowShoting();
                        FrontRowShoting(index);
                        break;
                    case 3:
                        BackRowShoting();
                        BackRowShoting(index);
                        break;
                    case 4:
                        VerticalRowShoting();
                        VerticalRowShoting(index);
                        break;
                    case 5:
                        SelfShoting();
                        SelfShoting(index);
                        break;
                    default:
                        Debug.LogError("子弹特效没有配置正确的TagAim,强制结束子弹特效 TagAim: " + skillConfig.TagAim);
@@ -76,23 +77,23 @@
    }
    // 0   全部范围:
    private void AllAreaShoting()
    private void AllAreaShoting(int index)
    {
        if (skillConfig.TagCount == 0 || skillConfig.TagCount >= 6)
        {
            // 若TagCount目标个数为0或6,根据TagFriendly敌我配置,代表作用于敌方全体或我方全体,此时主目标为敌我站位中的2号位置
            BattleCamp battleCamp = skillConfig.TagFriendly != 0 ? caster.Camp : caster.GetEnemyCamp();
            ShotToIndex(battleCamp, 1);
            ShotToIndex(battleCamp, 1, index);
        }
        else
        {
            // 若TagCount目标个数为1~5个,代表随机作用于敌方或我方x个武将,此时所有被随机到的对象都为主目标(施法位置会用客户端配置)
            ShotEachTargets();
            ShotEachTargets(index);
        }   
    }
    // 1    对位:
    private void OneTargetShoting()
    private void OneTargetShoting(int index)
    {
        // 默认只选1个,对位规则为A1优先打B1,A2优先打B2,A3优先打B3,对位目标死亡时,优先前排,
        // 比如B2已经死亡,那么A2将优先打B1,前排1、2、3号位置全部死亡之后才开始选择后排4、5、6号位置,
@@ -110,11 +111,11 @@
            Debug.LogError("目标为空 target == null ObjId : " + hurt.ObjID);
            return;
        }
        ShotToTarget(targetObject);
        ShotToTarget(targetObject, index);
    }
    // 2    前排:
    private void FrontRowShoting()
    private void FrontRowShoting(int index)
    {
        // 1、2、3号位为前排,默认2号位置为主目标,当1、2、3号位置角色全部死亡,前排将替换成后排,5号位置变更为主目标,
        // 若配置TagAffect细分目标,且人数小于3,则所有被选择目标均为主目标(施法位置会用客户端配置)
@@ -124,7 +125,7 @@
        if (skillConfig.TagAffect != 0 && skillConfig.TagAffect != 3 && skillConfig.TagCount < 3)
        {
            ShotEachTargets();
            ShotEachTargets(index);
        }
        else
        {
@@ -158,19 +159,19 @@
                targetIndex = 1;
            }
            ShotToIndex(battleCamp, targetIndex);
            ShotToIndex(battleCamp, targetIndex, index);
        }
    }
    private void ShotToIndex(BattleCamp camp, int targetIndex)
    private void ShotToIndex(BattleCamp camp, int targetIndex, int bulletIndex)
    {
        RectTransform targetTransform = caster.battleField.GetTeamNode(camp, targetIndex);
        BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.BulletEffectId, caster.heroRectTrans, caster.Camp);
        RectTransform effectTrans = effectPlayer.transform as RectTransform;
        var bulletCurve = BulletCurveFactory.CreateBulletCurve(caster, skillConfig, effectPlayer, targetTransform, tagUseSkillAttack, (index, hitList) =>
        var bulletCurve = BulletCurveFactory.CreateBulletCurve(caster, skillConfig, effectPlayer, targetTransform, tagUseSkillAttack, bulletIndex, (index, hitList) =>
        {
            if (isFinish)
                return;
@@ -205,7 +206,7 @@
    }
    // 3    后排:
    private void BackRowShoting()
    private void BackRowShoting(int index)
    {
        // 4、5、6号位为后排,默认5号位置为主目标,当4、5、6号位置角色全部死亡,后排排将替换成前排,2号位置变更为主目标,
        // 若配置TagAffect细分目标,且人数小于3,则所有被选择目标均为主目标(施法位置会用客户端配置)
@@ -215,7 +216,7 @@
        if (skillConfig.TagAffect != 0 && skillConfig.TagAffect != 3 && skillConfig.TagCount < 3)
        {
            ShotEachTargets();
            ShotEachTargets(index);
        }
        else
        {
@@ -249,12 +250,12 @@
                targetIndex = 4;
            }
            ShotToIndex(battleCamp, targetIndex);
            ShotToIndex(battleCamp, targetIndex, index);
        }
    }
    // 4    纵排:
    private void VerticalRowShoting()
    private void VerticalRowShoting(int index)
    {
        // 纵排分别为1、4,2、5,3、6,三组纵排,按对位规则选择,默认1号、2号或3号为主目标,前排1、2、3号位置全部死完后,4号、5号或6号为主目标
        BattleCamp battleCamp = skillConfig.TagFriendly != 0 ? caster.Camp : caster.GetEnemyCamp();
@@ -274,7 +275,7 @@
        if (minimumIndex != int.MaxValue)
        {
            ShotToIndex(battleCamp, minimumIndex);
            ShotToIndex(battleCamp, minimumIndex, index);
        }
        else
        {
@@ -286,17 +287,17 @@
    }
    // 5    自己:
    private void SelfShoting()
    private void SelfShoting(int index)
    {
        // 默认只选自己,自己为主目标
        ShotToIndex(caster.Camp, caster.teamHero.positionNum);
        ShotToIndex(caster.Camp, caster.teamHero.positionNum, index);
    }
    protected void ShotToTarget(BattleObject target)
    protected void ShotToTarget(BattleObject target, int bulletIndex)
    {
        BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.BulletEffectId, caster.heroRectTrans, caster.Camp);
        var bulletCurve = BulletCurveFactory.CreateBulletCurve(caster, skillConfig, effectPlayer, target.heroRectTrans, tagUseSkillAttack, (index, hitList) =>
        var bulletCurve = BulletCurveFactory.CreateBulletCurve(caster, skillConfig, effectPlayer, target.heroRectTrans, tagUseSkillAttack, bulletIndex, (index, hitList) =>
        {
            if (isFinish)
                return;
@@ -320,9 +321,11 @@
            onHit?.Invoke(index, hitList);
            // 击中就销毁子弹
            caster.battleField.battleEffectMgr.RemoveEffect(skillConfig.BulletEffectId, effectPlayer);
            // 播放子弹爆炸特效
            isFinish = true;
            if (bulletIndex >= skillConfig.ActiveFrames.Length - 1)
            {
                isFinish = true;
            }
        });
        bulletCurves.Add(bulletCurve);
@@ -344,7 +347,7 @@
        }
    }
    private void ShotEachTargets()
    private void ShotEachTargets(int index)
    {
        for (int i = 0; i < tagUseSkillAttack.HurtList.Length; i++)
        {
@@ -355,7 +358,7 @@
                Debug.LogError("特效目标为空 target == null ObjId : " + hurt.ObjID);
                continue;
            }
            ShotToTarget(target);
            ShotToTarget(target, index);
        }
    }
Main/System/Battle/UIComp/BattleHeroInfoBar.cs
@@ -135,7 +135,7 @@
            sliderHp.value = ((float)toHp) / ((float)maxHp);
        }
        BattleDebug.LogError("update hp from " + fromHp + " to " + toHp + " maxHp " + maxHp);
        // BattleDebug.LogError("update hp from " + fromHp + " to " + toHp + " maxHp " + maxHp);
    }
    public void UpdateXP(long fromXp, long toXp, long maxXp, bool tween = true)
@@ -157,7 +157,7 @@
            sliderXp.value = ((float)toXp) / ((float)maxXp);
        }
        BattleDebug.LogError("update xp from " + fromXp + " to " + toXp + " maxXp " + maxXp);
        // BattleDebug.LogError("update xp from " + fromXp + " to " + toXp + " maxXp " + maxXp);
    }
    public void Run()