うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】uGUI 要素の Order In Layer を表示する拡張

Canvas を複数使っている場合、途中で Override Sorting されていた場合

今の Order In Layer を調べるのが手間なことがある

f:id:hacchi_man:20211017234910p:plain

そのため、uGUI で描画されるオブジェクトには必ずついている Canvas Renderer

Inspector を拡張し現在の Order In Layer を表示するようにしてみた

f:id:hacchi_man:20211017235005p:plain

コード

using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(CanvasRenderer))]
public class CanvasRendererExtensionEditor : Editor
{
    private int? _orderInLayer;
 
    private void OnEnable()
    {
        var c =  target as CanvasRenderer;
        _orderInLayer = GetOrderInLayer(c.transform);
    }
 
    private int? GetOrderInLayer(Transform transform)
    {
        while (true)
        {
            if (transform == null)
                return null;

            var canvas = transform.GetComponent<Canvas>();
            transform = transform.parent;
            if (canvas == null)
            {
                continue;
            }

            if (canvas.overrideSorting)
            {
                return canvas.sortingOrder;
            }

            if (canvas == canvas.rootCanvas)
                return canvas.sortingOrder;
        }
    }
 
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        if (_orderInLayer.HasValue)
        {
            using (new EditorGUI.DisabledScope(true))
            {
                EditorGUILayout.IntField("Order In Layer", _orderInLayer.Value);
            }
        }
    }
}