yyl
8 天以前 6a10188f3eddc740b9b8b1e7eefb0e2fdb3850e3
125 【战斗】战斗系统 角色层级&战斗速度调整
16个文件已修改
2个文件已添加
427 ■■■■ 已修改文件
Main/Component/UI/Common/RendererAdjuster.cs 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Component/UI/Effect/BattleEffectPlayer.cs 99 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleEffectMgr.cs 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/BattleField.cs 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/BattleRootNode.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/RecordActions/DodgeFinishAction.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleObject/BattleObjMgr.cs 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleObject/BattleObject.cs 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleObject/BattleObjectLayerMgr.cs 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleObject/BattleObjectLayerMgr.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleTweenMgr.cs 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Buff/BattleObjectBuffMgr.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Motion/MotionBase.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/RecordPlayer/RecordPlayer.cs 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Skill/SkillBase.cs 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/SkillEffect/BulletSkillEffect.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/SkillEffect/NormalSkillEffect.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/SkillEffect/SkillEffect.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Component/UI/Common/RendererAdjuster.cs
@@ -5,7 +5,6 @@
public class RendererAdjuster : MonoBehaviour
{
    public int renderQueue = 3000;
    public int sortingOrder = 0;
@@ -13,7 +12,14 @@
    public List<Renderer> renderers = new List<Renderer>();
    protected Canvas canvas;
    public Action<string, int> onSortingChanged;
    protected void Awake()
    {
        UpdateComps();
    }
    public void SetSortingOrder(int sortingOrder)
    {
@@ -22,21 +28,12 @@
        UpdateSortingOrder();
    }
    public void Awake()
    {
        UpdateComps();
    }
    protected void OnEnable()
    {
        UpdateComps();
        UpdateSortingOrder();
    }
    protected void UpdateComps()
    {
        renderers.Clear();
        renderers.AddRange(gameObject.GetComponentsInChildren<Renderer>(true));
        canvas = GetComponent<Canvas>();
    }
    public void UpdateSortingOrder()
@@ -44,6 +41,7 @@
        // 将特效的排序顺序设置为Canvas排序顺序加上偏移量
        ApplySortingSettings(sortingOrder, customSortingLayer);
    }
    private void ApplySortingSettings(int sortingOrder, string sortingLayer)
    {
@@ -52,8 +50,6 @@
            if (renderer != null)
            {
                renderer.sortingOrder = sortingOrder;
                renderer.material.renderQueue = renderQueue; // 设置渲染队列
                // renderer.material.renderQueue = overlayRQ;
                if (!string.IsNullOrEmpty(sortingLayer))
                {
                    renderer.sortingLayerName = sortingLayer;
@@ -61,6 +57,15 @@
            }
        }
        if (null != canvas)
        {
            canvas.sortingOrder = sortingOrder;
            if (!string.IsNullOrEmpty(sortingLayer))
            {
                canvas.sortingLayerName = sortingLayer;
            }
        }
        onSortingChanged?.Invoke(sortingLayer, sortingOrder);
    }
}
Main/Component/UI/Effect/BattleEffectPlayer.cs
@@ -33,7 +33,7 @@
    public bool isRedCamp = true;
    public EffectConfig effectConfig;
    public float speedRate = 1f;
    public float speedRate = 1.5f;
@@ -43,11 +43,9 @@
    public Action<BattleEffectPlayer> onDestroy;
    [HideInInspector] public Canvas canvas = null;
    [HideInInspector] public GameObject effectTarget = null;
    protected EffectPenetrationBlocker blocker = null;
    protected RendererAdjuster blocker = null;
    protected bool isInit = false;
@@ -61,6 +59,8 @@
    protected SkeletonAnimation spineComp;
    protected Spine.AnimationState spineAnimationState;
    protected int heroSetedSortingOrder;
    public GameObjectPoolManager.GameObjectPool pool;
@@ -157,24 +157,43 @@
        onComplete?.Invoke();
    }
    public virtual void Play(bool showLog = true)
    public void SetSortingOrder(int _heroSetedSortingOrder)
    {
        heroSetedSortingOrder = _heroSetedSortingOrder;
        int so = heroSetedSortingOrder;
        if (!isInit)
        if (null != blocker && effectConfig != null)
        {
            if (BattleConst.UnactiveHeroSortingOrder == heroSetedSortingOrder)
            {
                InitComponent(showLog);
                isInit = true;
                so = effectConfig.frontBack == 1 ? BattleConst.UnactiveHeroFrontSortingOrder : BattleConst.UnactiveHeroBackSortingOrder;
            }
            else
            {
                //避免重复创建
                if (!this.gameObject.activeSelf)
                {
                    this.gameObject.SetActive(true);
                }
                return;
                so = effectConfig.frontBack == 1 ? BattleConst.ActiveHeroFrontSortingOrder : BattleConst.ActiveHeroBackSortingOrder;
            }
            blocker.SetSortingOrder(so);
        }
    }
    public virtual void Play(bool showLog = true)
    {
        if (!isInit)
        {
            InitComponent(showLog);
            isInit = true;
        }
        else
        {
            //避免重复创建
            if (!this.gameObject.activeSelf)
            {
                this.gameObject.SetActive(true);
            }
            return;
        }
        if (EffectMgr.IsNotShowBySetting(effectId))
        {
@@ -195,12 +214,12 @@
        if (effectConfig.autoDestroy != 0)
        {
            GameObject.Destroy(gameObject, effectConfig.destroyDelay);
            GameObject.Destroy(gameObject, effectConfig.destroyDelay / speedRate);
        }
        PlayEffect();
    }
@@ -250,22 +269,15 @@
        spineAnimationState.Complete -= OnSpineAnimationComplete;
        spineAnimationState.Complete += OnSpineAnimationComplete;
        if (null == canvas)
            canvas = GetComponentInParent<Canvas>();
        // 添加特效穿透阻挡器
        blocker = spineComp.AddMissingComponent<EffectPenetrationBlocker>();
        blocker = spineComp.AddMissingComponent<RendererAdjuster>();
        blocker.onSortingChanged = OnSortingChanged;
        //  如果没有canvas的话 正常是因为不在BattleWin下面的节点 意思就是当前没有显示 等到切回战斗的时候再通过BattleField.UpdateCanvas来更新
        if (canvas != null)
        {
            blocker.SetParentCanvas(canvas);
        }
        spineComp.enabled = true;
        spineComp.timeScale = speedRate;
        spineAnimationState.TimeScale = speedRate;
        Spine.Animation animation = spineAnimationState.Data.SkeletonData.Animations.First();
        spineAnimationState.SetAnimation(0, animation, effectConfig.isLoop != 0);
@@ -320,19 +332,11 @@
        OnUnityAnimationComplete();
        if (null == canvas)
            canvas = GetComponentInParent<Canvas>();
        // 添加特效穿透阻挡器
        blocker = effectTarget.AddMissingComponent<EffectPenetrationBlocker>();
        blocker = effectTarget.AddMissingComponent<RendererAdjuster>();
        blocker.onSortingChanged = OnSortingChanged;
        //  如果没有canvas的话 正常是因为不在BattleWin下面的节点 意思就是当前没有显示 等到切回战斗的时候再通过BattleField.UpdateCanvas来更新
        if (canvas != null)
        {
            blocker.SetParentCanvas(canvas);
        }
        SoundPlayer.Instance.PlayUIAudio(effectConfig.audio);
@@ -526,21 +530,18 @@
        return true;
    }
    /// <summary>
    /// 设置遮罩(支持RectMask2D、Mask、SmoothMask等)
    /// </summary>
    public void SetMask(RectTransform maskArea = null)
    public void SetSpeedRatio(float ratio)
    {
        if (effectTarget == null || blocker == null)
            return;
        // 优先使用传入的maskArea
        if (maskArea != null)
        speedRate = ratio;
        if (spineComp != null)
        {
            blocker.PerformMask(maskArea);
            return;
            spineComp.timeScale = speedRate;
        }
        // Animator动画
        foreach (var animator in animatorList)
        {
            animator.speed = speedRate;
        }
    }
}
Main/System/Battle/BattleEffectMgr.cs
@@ -43,7 +43,7 @@
        }
    }
    public BattleEffectPlayer PlayEffect(int ObjID, int effectId, Transform parent, BattleCamp camp)
    public BattleEffectPlayer PlayEffect(BattleObject layerDepender, int effectId, Transform parent, BattleCamp camp)
    {
        if (effectId <= 0)
        {
@@ -70,16 +70,30 @@
        effectPlayer.transform.position = parent.position;
        
        effectPlayer.onDestroy += OnEffectDestroy;
        BattleObject temp = layerDepender;
        effectPlayer.onDestroy += (efPlayer) =>
        {
            OnEffectDestroy(efPlayer);
            temp.layerMgr.RemoveEffect(efPlayer);
        };
        if (effectPlayer != null)
        {
            effectDict[effectId].Add(effectPlayer);
        }
        effectPlayer.Play(true);
        effectPlayer.SetSpeedRatio(battleField.speedRatio);
        
        var effectScale = effectPlayer.transform.localScale;
        effectScale.x *= isRedCamp ? 1 : -1;
        effectPlayer.transform.localScale = effectScale;
        if (null != layerDepender)
        {
            layerDepender.layerMgr.AddEffect(effectPlayer);
        }
        return effectPlayer;
    }
@@ -140,4 +154,15 @@
        effectDict.Clear();
    }
    public void SetSpeedRatio(float ratio)
    {
        foreach (var kvPair in effectDict)
        {
            foreach (var effectPlayer in kvPair.Value)
            {
                effectPlayer.SetSpeedRatio(ratio);
            }
        }
    }
}
Main/System/Battle/BattleField/BattleField.cs
@@ -24,6 +24,8 @@
    public int FuncLineID = 0;
    public float speedRatio = 1.1f;
    public JsonData extendData;
    public bool IsBattleFinish
@@ -86,7 +88,7 @@
        battleTweenMgr = new BattleTweenMgr();
        recordPlayer = new RecordPlayer();
    }
    public virtual void Init(int _MapID, int _FuncLineID, JsonData _extendData,
@@ -104,7 +106,7 @@
        battleEffectMgr.Init(this);
        battleTweenMgr.Init(this);
        recordPlayer.Init(this);
        if (blueTeamList == null)
        {
            battleObjMgr.Init(this, redTeamList[redTeamIndex], null);
@@ -115,7 +117,29 @@
            battleObjMgr.Init(this, redTeamList[redTeamIndex], blueTeamList[blueTeamIndex]);
        }
        battleRootNode.SetBackground(ResManager.Instance.LoadAsset<Texture>("Texture/FullScreenBg", "battlebg1"));
        battleRootNode.SetBackground(ResManager.Instance.LoadAsset<Texture>("Texture/FullScreenBg", "mainui_img_277"));
        SetBattleStartState();
        SetSpeedRatio(speedRatio);
    }
    public void SetSpeedRatio(float ratio)
    {
        speedRatio = ratio;
        battleObjMgr.SetSpeedRatio(ratio);
        recordPlayer.SetSpeedRatio(ratio);
        battleEffectMgr.SetSpeedRatio(ratio);
        battleTweenMgr.SetSpeedRatio(ratio);
    }
    protected virtual void SetBattleStartState()
    {
        foreach (var obj in battleObjMgr.allBattleObjDict.Values)
        {
            obj.layerMgr.SetFront();
        }
        battleRootNode.skillMaskNode.SetActive(false);
    }
    //  在Run之前要设置完毕 要创建Agent
@@ -363,14 +387,10 @@
    public void UpdateCanvas(Canvas canvas)
    {
        EffectPenetrationBlocker[] blockers = battleRootNode.GetComponentsInChildren<EffectPenetrationBlocker>(true);
        if (null != blockers)
        foreach (var obj in battleObjMgr.allBattleObjDict.Values)
        {
            foreach (var blocker in blockers)
            {
                blocker.SetParentCanvas(canvas);
            }
            obj.layerMgr.UpdateLayer();
        }
        // RendererAdjuster[] adjusters = battleRootNode.GetComponentsInChildren<RendererAdjuster>(true);
Main/System/Battle/BattleField/BattleRootNode.cs
@@ -49,4 +49,10 @@
            // imgBackground.SetNativeSize();
        }
    }
    public Transform skillBackNode;
    public Transform skillFrontNode;
    public GameObject skillMaskNode;
}
Main/System/Battle/BattleField/RecordActions/DodgeFinishAction.cs
@@ -6,7 +6,7 @@
    private bool isRun = false;
    public DodgeFinishAction(BattleField _battleField, BattleObject _dodgeObj)
        : base(RecordActionType.DodgeFinish, _battleField, null)
        : base(RecordActionType.DodgeFinish, _battleField, _dodgeObj)
    {
    }
Main/System/Battle/BattleObject/BattleObjMgr.cs
@@ -49,6 +49,7 @@
                battleObj.heroGo.SetActive(active);
                allBattleObjDict.Add(battleObj.ObjID, battleObj);
                campDict.Add(teamHero.positionNum, battleObj);
                battleObj.SetSpeedRatio(battleField.speedRatio);
            }
        }
    }
@@ -240,6 +241,14 @@
        }
    }
    public void SetSpeedRatio(float ratio)
    {
        foreach (var obj in allBattleObjDict.Values)
        {
            obj.SetSpeedRatio(ratio);
        }
    }
#if UNITY_EDITOR_STOP_USING
    public void ReviveAll()
    {
Main/System/Battle/BattleObject/BattleObject.cs
@@ -32,6 +32,8 @@
    public BattleObjectBuffMgr buffMgr;
    public BattleObjectLayerMgr layerMgr;
    public int ObjID { get; set; }
    public BattleCamp Camp { get; protected set; }
@@ -65,8 +67,6 @@
        }
    }
    public int sortingOrder = 0;
    protected Action onDeathAnimationComplete;
    protected Renderer[] renderers;
@@ -89,6 +89,9 @@
        buffMgr = new BattleObjectBuffMgr();
        buffMgr.Init(this);
        layerMgr = new BattleObjectLayerMgr();
        layerMgr.Init(this);
        renderers = heroGo.GetComponentsInChildren<Renderer>(true);
        heroInfoBar = heroGo.GetComponentInChildren<BattleHeroInfoBar>(true);
@@ -100,7 +103,7 @@
        heroInfoBar.transform.localScale = heroInfoBarScale;
        heroInfoBar.SetActive(true);
        SetToFront();
        SetFront();
    }
@@ -389,7 +392,7 @@
        heroRectTrans.anchoredPosition = Vector2.zero;
        heroInfoBar.SetActive(false);
        SetToFront();
        SetFront();
    }
    public void PushDropItems(BattleDrops _battleDrops)
@@ -411,34 +414,19 @@
        battleDrops = null;
    }
    public void SetToBack()
    public void SetBack()
    {
        sortingOrder = BattleConst.UnactiveHeroSortingOrder;
        UpdateSortingOrder();
        layerMgr.SetBack();
    }
    public void SetToFront()
    public void SetFront()
    {
        sortingOrder = BattleConst.ActiveHeroSortingOrder;
        UpdateSortingOrder();
        layerMgr.SetFront();
    }
    private void UpdateSortingOrder()
    public void SetSpeedRatio(float ratio)
    {
        if (null == renderers) return;
        foreach (var renderer in renderers)
        {
            if (renderer != null)
            {
                renderer.sortingOrder = sortingOrder;
            }
        }
    }
    public int GetSortingOrder()
    {
        return sortingOrder;
        motionBase.SetSpeedRatio(ratio);
    }
Main/System/Battle/BattleObject/BattleObjectLayerMgr.cs
New file
@@ -0,0 +1,67 @@
using UnityEngine;
using System.Collections.Generic;
public class BattleObjectLayerMgr
{
    public BattleObject battleObj;
    public RendererAdjuster rendererAdjuster;
    private List<BattleEffectPlayer> effectPlayers = new List<BattleEffectPlayer>();
    private bool isFront = true;
    public BattleObjectLayerMgr()
    {
    }
    public void Init(BattleObject battleObj)
    {
        this.battleObj = battleObj;
        rendererAdjuster = battleObj.heroGo.AddMissingComponent<RendererAdjuster>();
    }
    public void SetSortingOrder(int sortingOrder)
    {
        if (rendererAdjuster != null)
        {
            rendererAdjuster.SetSortingOrder(sortingOrder);
        }
    }
    public void AddEffect(BattleEffectPlayer effectPlayer)
    {
        if (effectPlayer != null && !effectPlayers.Contains(effectPlayer))
        {
            effectPlayers.Add(effectPlayer);
            effectPlayer.SetSortingOrder(rendererAdjuster.sortingOrder);
        }
    }
    public void RemoveEffect(BattleEffectPlayer effectPlayer)
    {
        if (effectPlayers.Contains(effectPlayer))
        {
            effectPlayers.Remove(effectPlayer);
        }
    }
    public void SetFront()
    {
        isFront = true;
        UpdateLayer();
    }
    public void SetBack()
    {
        isFront = false;
        UpdateLayer();
    }
    public void UpdateLayer()
    {
        int order = isFront ? BattleConst.ActiveHeroSortingOrder : BattleConst.UnactiveHeroSortingOrder;
        SetSortingOrder(order);
    }
}
Main/System/Battle/BattleObject/BattleObjectLayerMgr.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 9ccc1a52c3950a947a9159df13b88948
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Battle/BattleTweenMgr.cs
@@ -7,6 +7,8 @@
{
    private BattleField battleField;
    private float speedRatio => battleField.speedRatio;
    private List<Tween> tweenList = new List<Tween>();
    public void Init(BattleField _battleField)
@@ -45,6 +47,7 @@
        }
        tweenList.Add(tween);
        tween.timeScale = speedRatio;
        tween.onComplete += () =>
        { 
            tweenList.Remove(tween);
@@ -85,4 +88,15 @@
        }
        tweenList.Clear();
    }
    public void SetSpeedRatio(float ratio)
    {
        foreach (var tween in tweenList)
        {
            if (tween != null && !tween.IsComplete())
            {
                tween.timeScale = speedRatio;
            }
        }
    }
}
Main/System/Battle/Buff/BattleObjectBuffMgr.cs
@@ -101,14 +101,14 @@
                        }
                        else
                        {
                            BattleEffectPlayer effect = battleObject.battleField.battleEffectMgr.PlayEffect(battleObject.ObjID, skillConfig.EffectId, battleObject.heroRectTrans, battleObject.Camp);
                            BattleEffectPlayer effect = battleObject.battleField.battleEffectMgr.PlayEffect(battleObject, skillConfig.EffectId, battleObject.heroRectTrans, battleObject.Camp);
                            effectDict.Add(skillConfig.EffectId, effect);
                        }
                    }
                    else
                    {
                        effectDict = new Dictionary<int, BattleEffectPlayer>();
                        BattleEffectPlayer effect = battleObject.battleField.battleEffectMgr.PlayEffect(battleObject.ObjID, skillConfig.EffectId, battleObject.heroRectTrans, battleObject.Camp);
                        BattleEffectPlayer effect = battleObject.battleField.battleEffectMgr.PlayEffect(battleObject, skillConfig.EffectId, battleObject.heroRectTrans, battleObject.Camp);
                        effectDict.Add(skillConfig.EffectId, effect);
                        buffEffectDict.Add(vNetData.BuffID, effectDict);
                    }
Main/System/Battle/Motion/MotionBase.cs
@@ -393,6 +393,13 @@
        PlayAnimation(MotionName.idle, true);
    }
    public void SetSpeedRatio(float ratio)
    {
        MotionTimeScale = ratio;
        spineAnimationState.TimeScale = ratio;
        skeletonGraphic.timeScale = ratio;
    }
    #endregion
}
Main/System/Battle/RecordPlayer/RecordPlayer.cs
@@ -13,7 +13,9 @@
    private bool isWaitingNextAction = false;
    private float waitTimer = 0f;
    private const float waitInterval = 0f;
    private const float waitInterval = 0.2f;
    private float speedRatio = 1.5f;
    public void Init(BattleField _battleField)
    {
@@ -96,7 +98,7 @@
        // 等待下一个action
        if (isWaitingNextAction)
        {
            waitTimer += Time.deltaTime;
            waitTimer += Time.deltaTime * speedRatio;
            if (waitTimer >= waitInterval)
            {
                isWaitingNextAction = false;
@@ -183,4 +185,9 @@
        recordActionQueue.Clear();
        immediatelyActionList.Clear();
    }
    public void SetSpeedRatio(float ratio)
    {
        speedRatio = ratio;
    }
}
Main/System/Battle/Skill/SkillBase.cs
@@ -151,7 +151,7 @@
        // battleField.battleTweenMgr.OnPlayTween(tweener);
    }
    protected void MoveToTarget(RectTransform target, Vector2 offset, Action _onComplete = null)
    protected void MoveToTarget(RectTransform target, Vector2 offset, Action _onComplete = null, float speed = 500f)
    {
        //    原地释放
        if (skillConfig.CastDistance >= 9999)
@@ -165,7 +165,7 @@
        {
            caster.motionBase.PlayAnimation(MotionName.idle, true);
            _onComplete?.Invoke();
        });
        }, speed);
        battleField.battleTweenMgr.OnPlayTween(tweener);
    }
@@ -199,7 +199,7 @@
                        {
                            //    回到原来的位置
                            MoveToTarget(battleField.GetTeamNode(caster.Camp, caster.teamHero.positionNum), Vector2.zero, 
                                OnAttackFinish);
                                OnAttackFinish, 750F);
                        }
                    , -1f);
                });
@@ -238,7 +238,7 @@
                        {
                            RectTransform rectTransform = battleField.GetTeamNode(caster.Camp, caster.teamHero.positionNum);
                            //    回到原来的位置
                            MoveToTarget(rectTransform, Vector2.zero, OnAttackFinish);
                            MoveToTarget(rectTransform, Vector2.zero, OnAttackFinish, 750F);
                        }
                    , -1f);
                });
@@ -268,7 +268,7 @@
                        {
                            //    回到原来的位置
                            MoveToTarget(battleField.GetTeamNode(caster.Camp, caster.teamHero.positionNum),
                                Vector2.zero, OnAttackFinish);
                                Vector2.zero, OnAttackFinish, 750F);
                        }
                    , -1f);
                });
@@ -372,6 +372,9 @@
    protected void HighLightAllTargets()
    {
        if (skillConfig.FuncType != 2)
            return;
        // 高亮所有目标
        List<BattleObject> highlightList = battleField.battleObjMgr.GetBattleObjList(tagUseSkillAttack);
        highlightList.Add(caster);
@@ -383,15 +386,17 @@
            BattleObject bo = allList[i];
            if (highlightList.Contains(bo))
            {
                bo.SetToFront();
                bo.layerMgr.SetFront();
                bo.heroRectTrans.SetParent(battleField.battleRootNode.skillFrontNode, true);
            }
            else
            {
                bo.SetToBack();
                bo.layerMgr.SetBack();
                bo.heroRectTrans.SetParent(battleField.battleRootNode.skillBackNode, true);
            }
        }
        // battleField.skillMask.SetActive(true);
        battleField.battleRootNode.skillMaskNode.SetActive(true);
        // caster.battleField.skillMask
        //    把这些BO全高亮 或者说把除了这些的都放在遮罩后面
@@ -622,7 +627,25 @@
            }
        }
        return isFinished && moveFinished;
        if (isFinished && moveFinished)
        {
            List<BattleObject> allList = battleField.battleObjMgr.allBattleObjDict.Values.ToList<BattleObject>();
            for (int i = 0; i < allList.Count; i++)
            {
                BattleObject bo = allList[i];
                bo.layerMgr.SetFront();
                bo.heroRectTrans.SetParent(battleField.GetTeamNode(bo.Camp, bo.teamHero.positionNum), true);
            }
            battleField.battleRootNode.skillMaskNode.SetActive(false);
            return true;
        }
        else
        {
            return false;
        }
    }
    public virtual void ForceFinished()
Main/System/Battle/SkillEffect/BulletSkillEffect.cs
@@ -167,7 +167,7 @@
    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);
        BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.BulletEffectId, caster.heroRectTrans, caster.Camp);
        RectTransform effectTrans = effectPlayer.transform as RectTransform;
@@ -295,7 +295,7 @@
    protected void ShotToTarget(BattleObject target, int bulletIndex)
    {
        BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.BulletEffectId, caster.heroRectTrans, caster.Camp);
        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) =>
        {
@@ -336,7 +336,7 @@
        if (effectId <= 0)
            return;
        var effect = caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, effectId, parent, camp);
        var effect = caster.battleField.battleEffectMgr.PlayEffect(caster, effectId, parent, camp);
        if (effect != null)
        {
            effect.transform.localRotation = parent.localRotation;
Main/System/Battle/SkillEffect/NormalSkillEffect.cs
@@ -29,12 +29,12 @@
        if (skillConfig.ExplosionEffectId > 0)
        {
            caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.ExplosionEffectId, targetTransform, caster.Camp);
            caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.ExplosionEffectId, targetTransform, caster.Camp);
        }
        if (skillConfig.ExplosionEffect2 > 0)
        {
            caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.ExplosionEffect2, targetTransform, caster.Camp);
            caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.ExplosionEffect2, targetTransform, caster.Camp);
        }
        for (int i = 0; i < tagUseSkillAttack.HurtList.Length; i++)
@@ -49,7 +49,7 @@
            if (skillConfig.ExplosionEffect3 > 0)
            {
                caster.battleField.battleEffectMgr.PlayEffect(target.ObjID, skillConfig.ExplosionEffect3, target.heroGo.transform, caster.Camp);
                caster.battleField.battleEffectMgr.PlayEffect(target, skillConfig.ExplosionEffect3, target.heroGo.transform, caster.Camp);
            }
        }
Main/System/Battle/SkillEffect/SkillEffect.cs
@@ -27,11 +27,11 @@
        onHit = _onHit;
        if (skillConfig.EffectId > 0)
        {
            caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.EffectId, caster.heroRectTrans, caster.Camp);
            caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.EffectId, caster.heroRectTrans, caster.Camp);
        }
        if (skillConfig.EffectId2 > 0)
        {
            caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.EffectId2, caster.heroRectTrans, caster.Camp);
            caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.EffectId2, caster.heroRectTrans, caster.Camp);
        }
    }
@@ -50,7 +50,7 @@
        if (skillConfig.MStartEffectId <= 0)
            return;
        //  中摇固定特效
        caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.MStartEffectId, caster.heroGo.transform, caster.Camp);
        caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.MStartEffectId, caster.heroGo.transform, caster.Camp);
    }
    
    /// <summary>