【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;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章