1. 顺便提一下UI格子的动态排序,即通过改变子物体顺序,调整UI显示层级顺序
//设为第一个子物体
itemButton.transform.SetAsFirstSibling();
//设为最后一个子物体
itemButton.transform.SetAsLastSibling();
//设为指定顺序子物体
itemButton.transform.SetSiblingIndex(0);
2. 不改变子物体顺序调整显示层级顺序,在一些不能改变子物体顺序的情况,如果要调整UI界面内某部分的显示层级,部分UI区域高亮(比如新手引导全屏遮黑,可点击区域高亮,或者指定区域需要高亮显示,其余部分遮黑),可以给高亮区域添加Canvas组件,调整渲染层级
举个Demo:要求点击格子高亮,其余部分遮黑(动态为高亮格子添加Canvas组件)
现在遮黑区域是可点击状态,如果需要遮黑区域不可点击,勾选遮黑Image的Raycast Target,接收射线检测以屏蔽下方UI的点击
public class TestHandler : MonoBehaviour
{
[SerializeField] GameObject shadow;
Button[] buttons;
GameObject lastItem;
void Start()
{
//获取格子按钮,添加点击事件
buttons = GetComponentsInChildren<Button>();
for (int i = 0; i < buttons.Length; i++)
{
int index = i;
buttons[index].onClick.AddListener(() => OnBtnClick(buttons[index].gameObject));
}
//蒙黑遮罩
if (shadow != null)
shadow.SetActive(true);
}
void OnBtnClick(GameObject curItem)
{
//销毁上个格子的Canvas/GraphicRaycaster组件
if (lastItem != null)
{
//注意销毁顺序,GraphicRaycaster依赖于Canvas
Destroy(lastItem.GetComponent<GraphicRaycaster>());
Destroy(lastItem.GetComponent<Canvas>());
}
//添加当前格子的Canvas/GraphicRaycaster组件
if (curItem != null)
{
Canvas itemCanvas = curItem.AddComponent<Canvas>();
//开启层级排序
itemCanvas.overrideSorting = true;
//设置层级
itemCanvas.sortingOrder = 1;
curItem.AddComponent<GraphicRaycaster>();
}
//显示遮罩
if (shadow != null && !shadow.activeSelf)
shadow.SetActive(true);
//记录格子
lastItem = curItem;
}
}