125 战斗 1.战斗层级无效问题 2.连击不回原位就直接开打的问题 3.特效延迟销毁问题 4.部分技能使用之后会卡死的问题
7个文件已修改
149 ■■■■■ 已修改文件
Main/Component/UI/Common/RendererAdjuster.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleEffectMgr.cs 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/BattleRootNode.cs 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleObject/BattleObjectLayerMgr.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleUtility.cs 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Motion/MotionBase.cs 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Skill/SkillBase.cs 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Component/UI/Common/RendererAdjuster.cs
@@ -17,6 +17,8 @@
    protected Canvas canvas;
    public int canvasOffset = 1;
    public Action<string, int> onSortingChanged;
    protected void Awake()
@@ -39,7 +41,7 @@
        // skeletonAnimations.Clear();
        // skeletonAnimations.AddRange(gameObject.GetComponentsInChildren<SkeletonAnimation>(true));
        canvas = GetComponentInChildren<Canvas>();
        canvas = GetComponentInChildren<Canvas>(true);
    }
    public void UpdateSortingOrder()
@@ -65,7 +67,7 @@
        if (null != canvas)
        {
            canvas.sortingOrder = sortingOrder + 1;
            canvas.sortingOrder = sortingOrder + canvasOffset;
            if (!string.IsNullOrEmpty(sortingLayer))
            {
                canvas.sortingLayerName = sortingLayer;
Main/System/Battle/BattleEffectMgr.cs
@@ -15,6 +15,25 @@
        battleField = _battleField;
    }
    public void Run()
    {
        List<BattleEffectPlayer> runList = new List<BattleEffectPlayer>();
        foreach (KeyValuePair<int, List<BattleEffectPlayer>> kvPair in effectDict)
        {
            runList.AddRange(kvPair.Value);
        }
        for (int i = runList.Count - 1; i >= 0; i--)
        {
            BattleEffectPlayer effectPlayer = runList[i];
            if (effectPlayer != null)
            {
                effectPlayer.Run();
            }
        }
    }
    public void PauseGame()
    {
        foreach (KeyValuePair<int, List<BattleEffectPlayer>> kvPair in effectDict)
Main/System/Battle/BattleField/BattleRootNode.cs
@@ -33,6 +33,8 @@
    public RectTransform battleNodePos1;
    public RectTransform battleNodePos2;
    public RendererAdjuster rendererAdjuster;
    void Awake()
    {
        for (int i = 1; i <= TeamConst.MaxTeamSlotCount; i++)
@@ -44,6 +46,7 @@
            _blueTeamNodeList.Add(blueTrans.gameObject);
        }
        DontDestroyOnLoad(gameObject);
        // SetSortingOrder();
    }
    public void SetBackground(Texture texture)
@@ -55,6 +58,11 @@
        }
    }
    public void SetSortingOrder()
    {
        rendererAdjuster.SetSortingOrder(BattleConst.BlockerSortingOrder);
    }
    public Transform skillBackNode;
    public Transform skillFrontNode;
Main/System/Battle/BattleObject/BattleObjectLayerMgr.cs
@@ -65,8 +65,8 @@
        {
            effectPlayers[i].SetActive(isFront);
        }
        int order = isFront ? BattleConst.ActiveHeroSortingOrder : BattleConst.UnactiveHeroSortingOrder;
        //  策划要在释放技能的时候 其他角色隐藏 这里在back的时候就直接设置成0  在最底下 看不到的地方
        int order = isFront ? BattleConst.ActiveHeroSortingOrder : 0; //BattleConst.UnactiveHeroSortingOrder;
        SetSortingOrder(order);
    }
Main/System/Battle/BattleUtility.cs
@@ -63,9 +63,12 @@
    public static TweenerCore<Vector2, Vector2, DG.Tweening.Plugins.Options.VectorOptions> MoveToTarget(
        RectTransform transform, RectTransform target, Vector2 offset, Action onComplete = null, float speed = 500f)
    {
        // 获取目标节点的世界坐标(锚点位置)
        Vector3 worldPos = target.position;
        // 获取目标节点的世界坐标(中心点)
        Vector3 worldPos = target.TransformPoint(target.rect.center + offset);
        // 如果需要加 offset,需考虑 scale
        Vector3 offsetWorld = target.TransformVector(offset);
        worldPos += offsetWorld;
        RectTransform canvasRect = transform.parent as RectTransform;
@@ -77,45 +80,14 @@
            null,
            out localPoint);
        // 创建RawImage
        float distance = Vector2.Distance(transform.anchoredPosition, localPoint);
        float duration = distance / speed; // 假设速度为1000单位/秒,可以根据需要调整
        float duration = distance / speed;
        var tween = transform.DOAnchorPos(localPoint, duration).SetEase(Ease.Linear);
        tween.onComplete += () =>
        {
            onComplete?.Invoke();
        };
        // MarkStartAndEnd(transform as RectTransform, target);
        // // 1. 获取目标的世界坐标(加 offset)
        // Vector3 targetWorldPos = target.TransformPoint(target.anchoredPosition + offset);
        // // 2. 获取源节点的 parent
        // RectTransform sourceParent = transform.parent as RectTransform;
        // if (sourceParent == null)
        // {
        //     BattleDebug.LogError("源节点没有父节点,无法转换坐标!");
        //     return null;
        // }
        // // 3. 把目标世界坐标转换到源 parent 的本地坐标
        // Vector2 targetAnchoredPos;
        // RectTransformUtility.ScreenPointToLocalPointInRectangle(
        //     sourceParent,
        //     RectTransformUtility.WorldToScreenPoint(CameraManager.uiCamera, targetWorldPos),
        //     CameraManager.uiCamera,
        //     out targetAnchoredPos);
        // // 4. DOTween 移动
        // var tween = transform.DOAnchorPos(targetAnchoredPos, duration).SetEase(Ease.Linear);
        // tween.onComplete += () =>
        // {
        //     onComplete?.Invoke();
        // };
        return tween;
    }
Main/System/Battle/Motion/MotionBase.cs
@@ -111,6 +111,11 @@
    /// <returns>动画轨道条目</returns>
    public virtual Spine.TrackEntry PlayAnimation(MotionName motionName, bool loop, Action _onComplete = null)
    {
        if (isPlaySkillAnimation)
        {
            return null;
        }
        if (spineAnimationState == null) return null;
        // 如果当前动画未完成
@@ -147,17 +152,19 @@
        runActionList.Remove(_action);
    }
    private bool isPlaySkillAnimation = false;
    public Spine.TrackEntry PlaySkillAnimation(SkillConfig skillConfig, SkillBase skillBase, Action _onComplete = null)
    {
        // 参数校验
        if (skillConfig == null)
        {
            BattleDebug.LogError("技能配置为空,无法播放技能动画");
            Debug.LogError("技能配置为空,无法播放技能动画");
            return null;
        }
        if (spineAnimationState == null || skeleton == null)
        {
            BattleDebug.LogError("SkeletonGraphic或AnimationState未初始化,无法播放技能动画");
            Debug.LogError("SkeletonGraphic或AnimationState未初始化,无法播放技能动画");
            return null;
        }
@@ -181,7 +188,7 @@
        // 获取动画
        if (anim == null)
        {
            BattleDebug.LogError($"找不到动画: {skillConfig.SkillMotionName}");
            Debug.LogError($"找不到动画: {skillConfig.SkillMotionName}");
            _onComplete?.Invoke();
            return null;
        }
@@ -194,11 +201,11 @@
        // 播放动画
        var skillTrackEntry = spineAnimationState.SetAnimation(0, anim, false);
        isPlaySkillAnimation = true;
        currentTrackEntry = skillTrackEntry;
        // 事件状态
        int curLoop = 0;
        bool isFinish = false;
        bool beginPhaseTriggered = false;
        bool finalFrameStarted = false;
        bool finalFrameEnded = false;
@@ -216,9 +223,12 @@
        updateLocalHandler = () =>
        {
            if (isFinish) return;
            float frame = (skillTrackEntry.TrackTime * skillTrackEntry.TimeScale * (float)BattleConst.skillMotionFps);
            if (currentTrackEntry != skillTrackEntry)
            {
                Debug.LogError("技能动画被打断,强制结束 " + skillConfig.SkillID + " last animation : " + (currentTrackEntry != null && currentTrackEntry.Animation != null ? currentTrackEntry.Animation.Name : "null"));
            }
            if (skillTrackEntry.TrackTime == 0)
            {
@@ -230,7 +240,7 @@
                Debug.LogError("技能动画播放失败,回调异常,强制结束 " + skillConfig.SkillID + " 导致错误的原因是技能帧配置得太久导致技能动作结束了事件还没结束");
                skillBase.ForceFinished();
                RemoveRunAction(updateLocalHandler);
                isFinish = true;
                isPlaySkillAnimation = true;
                return;
            }
@@ -302,17 +312,13 @@
                if (finalFrameStarted && !finalFrameEnded && frame >= recoveryFrame)
                {
                    finalFrameEnded = true;
                    skillBase.OnFinalFrameEnd();
                    isPlaySkillAnimation = false;
                    RemoveRunAction(updateLocalHandler);
                    isFinish = true;
                    _onComplete?.Invoke();
                    skillBase.OnFinalFrameEnd();
                }
            }
        };
        if (_onComplete != null && currentTrackEntry != null)
        {
            trackEntryCompleteDict[currentTrackEntry] = _onComplete;
        }
        RunAction(updateLocalHandler);
Main/System/Battle/Skill/SkillBase.cs
@@ -50,7 +50,7 @@
        battleField = _battleField;
        packList = _packList;
        // Debug.LogError("start a skill id " + skillConfig.SkillID + " caster " + caster.teamHero.heroId + " pos " + caster.teamHero.positionNum + " camp " + caster.Camp);
    }
@@ -79,7 +79,10 @@
            }
            else
            {
                if (moveFinished)
                {
                otherSkillAction.Run();
                }
            }
            return;
        }
@@ -89,6 +92,7 @@
    // 1·移动到距离阵容位置n码的距离(如2号位,5号位)释放(即战场中央此类)
    public virtual void Cast()
    {
        // Debug.LogError("Cast skill " + skillConfig.SkillID + " cast position " + skillConfig.CastPosition + " cast mode " + skillConfig.castMode);
        string guid = battleField.guid;
        TeamHero teamHero = caster.teamHero;
        EventBroadcast.Instance.Broadcast<string, SkillConfig, TeamHero>(EventName.BATTLE_CAST_SKILL, guid, skillConfig, teamHero);
@@ -162,6 +166,8 @@
            _onComplete?.Invoke();
        }, speed);
        battleField.battleTweenMgr.OnPlayTween(tweener);
        // Debug.LogError("move to tarrget " + target.name + " offset " + offset + " speed " + speed + " time " + tweener.Duration());
    }
    protected void TurnBack(Action _onComplete, float forward)
@@ -244,6 +250,16 @@
    protected virtual void OnAllAttackMoveFinished()
    {
        moveFinished = true;
        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);
            bo.heroInfoBar.SetActive(true);
        }
        battleField.battleRootNode.skillMaskNode.SetActive(false);
        // Debug.LogError("OnAllAttackMoveFinished skill " + skillConfig.SkillID + " cast position " + skillConfig.CastPosition + " cast mode " + skillConfig.castMode);
    }
    protected void CastToAllies()
@@ -365,6 +381,8 @@
        caster.heroInfoBar.SetActive(false);
        for (int i = 0; i < allList.Count; i++)
        {
            BattleObject bo = allList[i];
@@ -372,12 +390,12 @@
            {
                bo.layerMgr.SetFront();
                bo.heroInfoBar.SetActive(true);
                bo.heroRectTrans.SetParent(battleField.battleRootNode.skillFrontNode, true);
                // bo.heroRectTrans.SetParent(battleField.battleRootNode.skillFrontNode, true);
            }
            else
            {
                bo.layerMgr.SetBack();
                bo.heroRectTrans.SetParent(battleField.battleRootNode.skillBackNode, true);
                // bo.heroRectTrans.SetParent(battleField.battleRootNode.skillBackNode, true);
            }
            if (targetList.Contains(bo))
@@ -393,7 +411,7 @@
        caster.layerMgr.SetSortingOrder(BattleConst.ActiveHeroActionSortingOrder);
        battleField.battleRootNode.skillMaskNode.SetActive(true);
        battleField.battleRootNode.SetSortingOrder();
        // caster.battleField.skillMask
        //    把这些BO全高亮 或者说把除了这些的都放在遮罩后面
        //    YYL TODO
@@ -646,23 +664,13 @@
        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);
                bo.heroInfoBar.SetActive(true);
            }
            battleField.battleRootNode.skillMaskNode.SetActive(false);
            if (packList.Count > 0)
            {
                OnSkillFinished();
                return false;
            }
            return packList.Count <= 0;
            return true;
        }
        else
        {