[Unity] 重なり合うボタンを処理する


全てのボタンが同じtransformの子になっている前提で、
重なり合っているボタンをこんな風に処理したい

一番簡単なのは、OnClick()で

button.gameObject.transform.SetAsFirstSibling();

のように最背面に移動してしまうことなのですが、これだと次のボタンが押せるようになる代わりに表示も背面に隠れてしまいます。

そこで、

for (int i = 0; i < transform.childCount; ++i)
{
    UnityEngine.UI.Image img = _transform.gameObject.GetComponent<UnityEngine.UI.Image>();
    if (transform.GetChild(i).Equals(_transform))
    {
        img.color = Color.red;
        img.raycastTarget = false;
        transform.GetChild(i).SetAsLastSibling(); // 今回選択したものを最前面に
    }
    else if (!img.raycastTarget) // 前回最前面だったものを最背面にする
    {
        img.color = Color.white;
        img.raycastTarget = true;
        transform.GetChild(i).transform.SetAsFirstSibling();
    }
}

のように、今回選択したものは raycastTarget をfalseにして押せなくしつつ最前面に、前回選択していたものはraycastTarget を元に戻しつつ最背面に送ることで、選択したものを最前面に残しつつ、後ろのボタンを押せるようになります。