目次
はじめに
通常 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 からのアクティブ変更時にRecordObject
とEditorUtility.SetDirty
を行うことで、エディターに変更を認知させます。
これによりシーン切り替え時や実行時にも変更後の状態が保存されるようになります。
関連記事