You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中相同Sorting Layer设置的预制体显示效果不一致问题求助

2D卡牌游戏文本重叠与排序失效问题解决

问题概述

  • 2D卡牌Prefab结构:背景Sprite(Default层)+ 文本Canvas子对象(UI层)
  • 核心问题:卡牌文本互相重叠,复制正常Prefab的组件设置无效;脚本修改文本Canvas的sortingOrder始终为0,导致文本被背景遮挡;卡牌翻面时文本会切换激活状态,逻辑复杂。

快速解决方法

1. 排查Prefab的隐藏异常设置

  • 打开异常Prefab的Prefab编辑模式,检查Canvas组件是否有Override标记,右键选择Revert All还原到正常Prefab的配置
  • 确认卡牌父对象、背景Sprite、文本Canvas的Layer和Sorting Layer与正常Prefab完全一致(包括Text组件自身的排序设置)
  • 检查文本Canvas的Canvas Renderer组件,确认Sorting Layer和Order in Layer未被单独修改

2. 修复脚本的Canvas排序逻辑

原脚本错误地获取了全局主Canvas,而非卡牌的子Canvas,修改后:

private SortingGroup _sortingGroup;
private Collider2D _collider;
private List<Canvas> _childCanvases = new();

private void Awake()
{
    _collider = GetComponent<Collider2D>();
    _sortingGroup = GetComponent<SortingGroup>();
    // 缓存所有子Canvas(包括非激活状态)
    GetComponentsInChildren<Canvas>(true, _childCanvases);
}

public void OnBeginDrag(PointerEventData eventData)
{
    _collider.enabled = false;
    if (_sortingGroup == null) return;

    sortingOrderCounter++;
    _sortingGroup.sortingOrder = sortingOrderCounter;

    foreach (var canvas in _childCanvases)
    {
        canvas.overrideSorting = true;
        canvas.sortingOrder = sortingOrderCounter;
        canvas.sortingLayerName = _sortingGroup.sortingLayerName;
    }
}
  • 提前缓存子Canvas,避免重复查找,同时覆盖非激活状态的文本Canvas,解决翻面激活后的排序问题
  • 强制同步Canvas的Sorting Layer与父对象SortingGroup一致,消除层不匹配导致的排序失效

3. 零脚本简化方案(推荐)

给卡牌父对象添加SortingGroup组件:

  • 将背景Sprite的Sorting Layer设为与SortingGroup一致
  • 关闭文本Canvas的Override Sorting选项
  • 拖拽时仅需修改SortingGroup的sortingOrder,背景和文本会自动同步排序,完全无需单独处理Canvas

此方案彻底规避了文本激活/非激活的排序问题,是最简单的长期解决方案。

内容的提问来源于stack exchange,提问作者algo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 17:19:52