【Unity】Hierarchy からオブジェクトの ON/OFF を切り替える拡張機能【エディター拡張】

HierarchyからオブジェクトのON/OFFを切り替える

はじめに

通常 Unity エディター上から Hierarchy にあるオブジェクトのアクティブを切り替える時は Inspector で変更します。

この記事では、Unity の Hierarchy ビューからオブジェクトのアクティブ切り替えが可能になるエディター拡張を紹介します。

Unity 環境
Unity 2020.2.0f1

拡張後の見た目

Hierarchy の右側に、オブジェクトのアクティブを切り替えるトグルが表示されるようになります。

アクティブを切り替えるトグルの表示

実際の挙動は以下になります。

実際の挙動

コード紹介

using UnityEngine;
using UnityEditor;

public static class HierarchyGUI
{
    private const int WIDTH = 16;
    private const int OFFSET = 10;

    [InitializeOnLoadMethod]
    private static void Initialize()
    {
        EditorApplication.hierarchyWindowItemOnGUI += OnGUI;
    }
    
    private static void OnGUI(int instanceID, Rect selectionRect)
    {
        var go = EditorUtility.InstanceIDToObject(instanceID) as GameObject;
        if (go == null)
        {
            return;
        }

        var pos = selectionRect;
        pos.x = pos.xMax - OFFSET;
        pos.width = WIDTH;

        bool active = GUI.Toggle(pos, go.activeSelf, string.Empty);
        if (active == go.activeSelf)
        {
            return;
        }

        Undo.RecordObject(go, $"{(active ? "Activate" : "Deactivate")} GameObject '{go.name}'");
        go.SetActive(active);
        EditorUtility.SetDirty(go);
    }
}

コード解説

InitializeOnLoadMethod

静的 (static) メソッドに InitializeOnLoadMethod 属性を付加することで、Unity エディター起動時やスクリプトのコンパイル直後にメソッドが呼び出されます。

クラスの静的コンストラクタを呼び出すための属性として、InitializeOnLoad も存在します。

EditorApplication.hierarchyWindowItemOnGUI

Hierarchy ビューで各ゲームオブジェクトやアセットの文字が描画されている範囲をコールバックとして取得できます。

Hierarchy からの変更を保存

33 ~ 35行目では以下の3行が書かれています。

Undo.RecordObject(go, $"{(active ? "Activate" : "Deactivate")} GameObject '{go.name}'");
go.SetActive(active);
EditorUtility.SetDirty(go);

Hierarchy からのアクティブ変更時にRecordObjectEditorUtility.SetDirty を行うことで、エディターに変更を認知させます。

これによりシーン切り替え時や実行時にも変更後の状態が保存されるようになります。

関連記事