【Unity】UGUI不改变子物体顺序调整显示层级顺序

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;
    }
}
发布了104 篇原创文章 · 获赞 74 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qq_39108767/article/details/103687637