エディタ拡張でScene View上で常に輪郭を表示する

layoutgroupだったり、スクリプトで動的に何かを生成する都合上、表示上はなにもないがサイズが欲しいrectだったりというのが画面レイアウトするうえで出てくることがある。 これらは選択したらrectの輪郭が表示されるが、親のrectからはみ出ていないか確認しながらサイズ調整をしたいので、常に表示されてほしいと思った。

ので。

[InitializeOnLoad]
public class CreateFrameOnSceneView
{
    static CreateFrameOnSceneView()
    {
        SceneView.duringSceneGui += OnGui;
    }
    private static void OnGui(SceneView sceneView)
    {
        var objs = GameObject.FindGameObjectsWithTag("Frame");
        foreach (var obj in objs)
        {
            var v = new Vector3[4];
            obj.GetComponent<RectTransform>().GetWorldCorners(v);
            Handles.color = new Color(0, 0, 0, 1);
            Handles.DrawLines(new Vector3[]{ v[0], v[1], v[1], v[2], v[2], v[3], v[3], v[0]});
        }
    }
}

これでTagに「フレーム」を当てると常に表示されるようになる。

f:id:Piffett:20211201191140p:plain

だいぶ見にくいが、見にくいくらいでちょうどよい。 FindGameObjectsWithTagを高頻度で読んでしまっているのでちょっと不安