太郎Work

Unityとかで困ったこと等を残しておきます

Unity2021.2のOverlay機能を使う

Overlay機能

Unity2021.2からSceneView上の要素はOverlayというものに置き換わり、自由に配置を動かせるようになりました。
ParticleSystemを選択したときのウィンドウも↓こんな感じになっていて左上をドラッグすることで自由に動かすことができます

f:id:tarowork:20220318174303p:plain:w300
ParticleSystemOverlay

自分でも追加したくなったのでやってみたのですがめちゃくちゃ簡単だったのでメモ

Overlay作成

OverlayAttributeをつけて簡単なクラスを実装するだけです

Editor拡張クラスのprivateクラスで以下のようなクラス定義をするのが一番楽そうです

// staticで選択中のデータを入れておく
private static OverlayData _overlayData;

// EditorのOnEnableで生成
void OnEnable()
{
    _overlayData = new OverlayData();
}

// EditorのOnDisableで空にしておく
void OnDisable()
{
    _overlayData = null;
}

// Overlay側への受け渡し用のクラス
private class OverlayData
{
    public readonly int[] counts=new int[16];
}

// 第2引数のIDは被らないように命名
[Overlay(typeof(SceneView), "Scene View/CustomID", "タイトル", false)]
private class SceneViewOverlay : IMGUIOverlay, ITransientOverlay
{
    private bool _foldout;

    public bool visible => _overlayData != null;

    public override void OnGUI()
    {
        if (_overlayData == null) return;
        EditorGUILayout.LabelField("合計", _overlayData.counts.Sum().ToString());
        _foldout = EditorGUILayout.Foldout(_foldout, "詳細", true);
        if (_foldout)
        {
            EditorGUI.indentLevel++;
            for (int i = 0; i < _overlayData.counts.Length; i++)
                EditorGUILayout.LabelField($"[{i}]", _overlayData.counts[i].ToString());
            EditorGUI.indentLevel--;
        }
    }
}
f:id:tarowork:20220318180324p:plain
Editor選択中SceneViewに表示される

このコードだけでSceneViewに表示されて動かしたり他の要素へのスナップもできます

OverlayAttribute

このAttributeをクラスにつけるだけでSceneView内に配置されます

IMGUIOverlay

このクラスを継承することでOnGUIの実装ができます

ITransientOverlay

このインターフェースによって表示非表示の切り替えができます

Overlay

IMGUIOverlayの代わりにOverlayを使用するとUIElementでの実装になります

まとめ

めちゃくちゃ便利だった