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