UnityでuGUIのImageを3Dに載せたときの重なり方をいい感じにする

こんにちは。ヤマヤタケシです。
ゲームとかでよくある表現ですけど、3Dのターゲットに2Dのテキストを重ねたくなりますね。

そんなとき、UnityのuGUIだと、Zによって自動的にソートなどはされません。
ヒエラルキーの順番に描画されます。
なので、3Dオブジェクトのカメラに映ったときのZに応じて親子関係をいじりましょう。

そんなコードはこちら!

public class MyText : MonoBehaviour
{
    public Transform target; // 3Dのターゲット

    void Update()
    {
        var sp = Camera.main.WorldToScreenPoint(target.position);
        SortKey = sp.z;
    }

    public float SortKey
    {
        get; private set;
    }
}


public class Manager : MonoBehaviour
{
    void LateUpdate()
    {
        // ターゲットのZに応じてソートする。
        var list = GetComponentsInChildren();
        Array.Sort(list, (a, b) =>
                {
                    var delta = a.SortKey - b.SortKey;
                    if (delta < 0) { return 1; }
                    if (0 < delta) { return -1; }
                    return 0;
                });

        for(var n = 0; n < list.Length; ++n)
        {
            list[n].transform.SetSiblingIndex(n);
        }
    }
}

[uGUI]実行中に表示順序を変えるを参考にしました!

そんじゃまた。