Unity 2D层级控制:实现窗口与块的特定显示层级逻辑
实现思路与代码方案
要实现「窗口外Block在所有窗口下方,窗口内Block在所属窗口上方」的层级逻辑,核心是通过**Sorting Layer(排序层)**结合动态脚本判断来控制Sprite Renderer的显示层级,具体步骤如下:
1. 配置排序层
在Unity编辑器中创建3个排序层,层级优先级从低到高:
Block_Bottom:用于所有不在窗口内的BlockWindow_Layer:所有Window的专属层级Block_Top:用于窗口内的Block
配置路径:Edit > Project Settings > Tags and Layers > Sorting Layers,拖拽调整层级顺序确保Block_Bottom < Window_Layer < Block_Top。
2. 给Block挂载层级控制脚本
创建如下C#脚本,挂载到所有Block预制体上,用于动态判断Block是否处于Window内,并切换对应的排序层:
using UnityEngine; public class BlockLayerManager : MonoBehaviour { private SpriteRenderer _sr; [Header("排序层配置")] public SortingLayer bottomLayer; // 赋值为Block_Bottom public SortingLayer topLayer; // 赋值为Block_Top void Awake() { _sr = GetComponent<SpriteRenderer>(); UpdateBlockLayer(); } // 当父物体变化时自动更新层级(比如用户拖拽Block进/出窗口) void OnTransformParentChanged() { UpdateBlockLayer(); } void UpdateBlockLayer() { // 判断当前Block是否是Window的子物体(这里假设Window有专属脚本Window.cs) bool isInsideWindow = transform.parent != null && transform.parent.GetComponent<Window>() != null; // 切换排序层 _sr.sortingLayerID = isInsideWindow ? topLayer.id : bottomLayer.id; // 可选:让窗口内的Block始终在所属Window上方(结合Order in Layer) if (isInsideWindow) { SpriteRenderer windowSr = transform.parent.GetComponent<SpriteRenderer>(); _sr.sortingOrder = windowSr.sortingOrder + 1; } else { _sr.sortingOrder = 0; } } }
3. 配置Window的层级
给所有Window的Sprite Renderer设置:
- Sorting Layer:
Window_Layer - Sorting Order:可根据需求设置(比如按创建顺序递增,确保后创建的Window显示在前面)
关键说明
- 如果不用专属脚本判断Window,也可以给Window添加
Window标签,将判断逻辑改为transform.parent != null && transform.parent.CompareTag("Window") - 若场景中有大量Block,可考虑将
OnTransformParentChanged替换为批量检测逻辑(比如每帧检测或用户操作触发),减少性能消耗
内容的提问来源于stack exchange,提问作者Jaimin Vashi
相关产品推荐
相关产品推荐

