yyl
9 天以前 ee791f4c389d9a3f45f32532521eb20efd0d8a9a
125 【战斗】战斗系统 层级问题处理
10个文件已修改
235 ■■■■ 已修改文件
Main/Component/UI/Common/RendererAdjuster.cs 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Manager/UIManager.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleConst.cs 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/BattleField.cs 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleObject/BattleObjMgr.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleObject/BattleObject.cs 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Skill/SkillBase.cs 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/SkillEffect/BulletSkillEffect.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/SkillEffect/NormalSkillEffect.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/UIBase/UIBase.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Component/UI/Common/RendererAdjuster.cs
@@ -7,50 +7,42 @@
{
    public int renderQueue = 3000;
    public Canvas canvas;
    public int sortingOrderOffset = 1;
    public int sortingOrder = 0;
    public string customSortingLayer = "UI";
    public List<Renderer> renderers = new List<Renderer>();
    public Action<string, int> onSortingChanged;
    public void SetSortingOrder(int sortingOrder)
    {
        this.sortingOrder = sortingOrder;
        UpdateComps();
        UpdateSortingOrder();
    }
    public void Awake()
    {
        UpdateComps();
    }
    protected void OnEnable()
    {
        UpdateComps();
        UpdateSortingOrder();
    }
    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);
        ApplySortingSettings(sortingOrder, customSortingLayer);
    }
    private void ApplySortingSettings(int sortingOrder, string sortingLayer)
@@ -68,5 +60,7 @@
                }
            }
        }
        onSortingChanged?.Invoke(sortingLayer, sortingOrder);
    }
}
Main/Manager/UIManager.cs
@@ -50,7 +50,7 @@
    private int currentRound = 0;
    
    // 缓存层级对应的排序顺序
    private Dictionary<UILayer, int> layerSortingOrderCache = new Dictionary<UILayer, int>();
    private static Dictionary<UILayer, int> layerSortingOrderCache = new Dictionary<UILayer, int>();
    
    // 缓存层级对应的Transform
    private Dictionary<UILayer, Transform> layerTransformCache = new Dictionary<UILayer, Transform>();
@@ -136,7 +136,7 @@
    #region 辅助方法
    
    // 获取UI层级对应的基础排序顺序
    private int GetBaseSortingOrderForLayer(UILayer layer)
    public static int GetBaseSortingOrderForLayer(UILayer layer)
    {
        // 尝试从缓存中获取排序顺序
        if (layerSortingOrderCache.TryGetValue(layer, out int order))
Main/System/Battle/BattleConst.cs
@@ -7,4 +7,101 @@
    public const int skillMotionFps = 30;
    public const int BattlePointItemID = 3;//战锤ID
    //  1000~10000之间的战斗层级
    //  需要考虑根据UI 特效 战斗角色三方的层级关系
    //  确立基本的层级范围 后往上累加
    //  1.不能在BattleWin之下 否则就看不见了
    //  2.处理EffectPenetrationBlocker的自动调整排序
    //  3.要联动EffectConfig的前后的问题
    //  BattleWin.Canvas.sortingOrder是最低值
    //  还需要确立黑色的Mask的层级
    //  UI界面|非激活英雄|挡板|激活英雄
    // 非激活英雄后特效|非激活英雄|非激活英雄前
    // 激活英雄后特效|激活英雄|激活英雄前特效
    public const int BattleBlackTransparentMaskOffset = 100;
    public static int BattleWinSortingOrder
    {
        get
        {
            BattleWin battleWin = UIManager.Instance.GetUI<BattleWin>();
            if (battleWin != null)
            {
                return battleWin.GetSortingOrder();
            }
            return 0;
        }
    }
    // 非激活英雄的层级
    public static int UnactiveHeroSortingOrder
    {
        get
        {
            return BattleWinSortingOrder + BattleBlackTransparentMaskOffset - 50;
        }
    }
    // 非激活英雄的后特效
    public static int UnactiveHeroBackSortingOrder
    {
        get
        {
            return UnactiveHeroSortingOrder - 1;
        }
    }
    // 非激活英雄的前特效
    public static int UnactiveHeroFrontSortingOrder
    {
        get
        {
            return UnactiveHeroSortingOrder + 1;
        }
    }
    // 挡板的层级
    public static int BlockerSortingOrder
    {
        get
        {
            return UnactiveHeroFrontSortingOrder + 1;
        }
    }
    // 激活英雄的层级
    public static int ActiveHeroSortingOrder
    {
        get
        {
            return BattleWinSortingOrder + BattleBlackTransparentMaskOffset + 50;
        }
    }
    // 激活英雄的后特效
    public static int ActiveHeroBackSortingOrder
    {
        get
        {
            return ActiveHeroSortingOrder - 1;
        }
    }
    // 激活英雄的前特效
    public static int ActiveHeroFrontSortingOrder
    {
        get
        {
            return ActiveHeroSortingOrder + 1;
        }
    }
}
Main/System/Battle/BattleField/BattleField.cs
@@ -373,14 +373,14 @@
            }
        }
        RendererAdjuster[] adjusters = battleRootNode.GetComponentsInChildren<RendererAdjuster>(true);
        if (null != adjusters)
        {
            foreach (var adjuster in adjusters)
            {
                adjuster.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/BattleObjMgr.cs
@@ -12,7 +12,7 @@
    private Dictionary<int, BattleObject> redCampDict = new Dictionary<int, BattleObject>();
    private Dictionary<int, BattleObject> blueCampDict = new Dictionary<int, BattleObject>();
    protected Dictionary<int, BattleObject> allBattleObjDict = new Dictionary<int, BattleObject>();
    public Dictionary<int, BattleObject> allBattleObjDict = new Dictionary<int, BattleObject>();
    protected BattleField battleField;
Main/System/Battle/BattleObject/BattleObject.cs
@@ -65,6 +65,8 @@
        }
    }
    public int sortingOrder = 0;
    protected Action onDeathAnimationComplete;
    protected Renderer[] renderers;
@@ -96,8 +98,9 @@
        var heroInfoBarScale = heroInfoBar.transform.localScale;
        heroInfoBarScale.x *= Camp == BattleCamp.Red ? 1 : -1;
        heroInfoBar.transform.localScale = heroInfoBarScale;
        heroInfoBar.SetActive(true);
        SetToFront();
    }
@@ -271,7 +274,7 @@
        {
            motionBase.PlayAnimation(MotionName.hit, false);
        }
    }
    }
    public void SuckHp(uint suckHP, SkillConfig skillConfig)
    {
@@ -280,7 +283,7 @@
    public void HurtByReflect(uint bounceHP, SkillConfig skillConfig)
    {
    }
    //  闪避开始
@@ -386,6 +389,7 @@
        heroRectTrans.anchoredPosition = Vector2.zero;
        heroInfoBar.SetActive(false);
        SetToFront();
    }
    public void PushDropItems(BattleDrops _battleDrops)
@@ -407,8 +411,35 @@
        battleDrops = null;
    }
    public void SetToBack()
    {
        sortingOrder = BattleConst.UnactiveHeroSortingOrder;
        UpdateSortingOrder();
    }
    public void SetToFront()
    {
        sortingOrder = BattleConst.ActiveHeroSortingOrder;
        UpdateSortingOrder();
    }
    private void UpdateSortingOrder()
    {
        if (null == renderers) return;
        foreach (var renderer in renderers)
        {
            if (renderer != null)
            {
                renderer.sortingOrder = sortingOrder;
            }
        }
    }
    public int GetSortingOrder()
    {
        return sortingOrder;
    }
#if UNITY_EDITOR_STOP_USING
Main/System/Battle/Skill/SkillBase.cs
@@ -373,9 +373,26 @@
    protected void HighLightAllTargets()
    {
        // 高亮所有目标
        HashSet<BattleObject> highlightList = new HashSet<BattleObject>(battleField.battleObjMgr.GetBattleObjList(tagUseSkillAttack));
        List<BattleObject> highlightList = battleField.battleObjMgr.GetBattleObjList(tagUseSkillAttack);
        highlightList.Add(caster);
        List<BattleObject> allList = battleField.battleObjMgr.allBattleObjDict.Values.ToList<BattleObject>();
        for (int i = 0; i < allList.Count; i++)
        {
            BattleObject bo = allList[i];
            if (highlightList.Contains(bo))
            {
                bo.SetToFront();
            }
            else
            {
                bo.SetToBack();
            }
        }
        // battleField.skillMask.SetActive(true);
        // caster.battleField.skillMask
        //    把这些BO全高亮 或者说把除了这些的都放在遮罩后面
        //    YYL TODO
Main/System/Battle/SkillEffect/BulletSkillEffect.cs
@@ -336,7 +336,7 @@
        if (effectId <= 0)
            return;
        var effect = caster.battleField.battleEffectMgr.PlayEffect(0, effectId, parent, camp);
        var effect = caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, 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(0, skillConfig.ExplosionEffectId, targetTransform, caster.Camp);
            caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.ExplosionEffectId, targetTransform, caster.Camp);
        }
        if (skillConfig.ExplosionEffect2 > 0)
        {
            caster.battleField.battleEffectMgr.PlayEffect(0, skillConfig.ExplosionEffect2, targetTransform, caster.Camp);
            caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.ExplosionEffect2, targetTransform, caster.Camp);
        }
        for (int i = 0; i < tagUseSkillAttack.HurtList.Length; i++)
Main/System/UIBase/UIBase.cs
@@ -433,6 +433,16 @@
        return UIEffectPlayer.CreateEffect(id, parent, false);
    }
    public int GetSortingOrder()
    {
        if (null != canvas)
        {
            return canvas.sortingOrder;
        }
        return 0;
    }
    
    #endregion