はじめに
ゲームオブジェクトにアタッチされているコンポーネントについて、自前スクリプトコンポーネントなど見やすさの観点から Inspector の最上位に移動したいことがよくあります。
その際に、コンポーネントを右クリックしてコンテキストメニューを開き Move Up を選択してポチポチ移動するのも手間がかかるし、コンポーネントをドラッグ アンド ドロップして移動するのも上手く操作できない時があるので、一気に Inspector の最上位へコンポーネントを移動してくれるメニュー(Move Top)を追加しました。
注意
Inspectorの使用 Reorder GameObject components - Unityマニュアルより
- ゲームオブジェクトの Transform コンポーネントは常に最上位のコンポーネントのため、ここで言う Inspector の最上位 とは Transform コンポーネントの下の位置 を意味します
- Inspector のコンポーネントの順序は GetComponents で取得したコンポーネントの順序と同じであることが保証されています
詳細
作業環境
- Unity 2021.3.6f1
- Unity 2020.3.20f1
操作手順
- Inspector の最上位に移動したいコンポーネントを
右クリックしてコンテキストメニューを開く - コンテキストメニューから Move Top を選択する
※既に Inspector の最上位にあるコンポーネントやTransform コンポーネントは Move Top を選択出来ません - コンポーネントの位置が Inspector の最上位に移動していることを確認する
動作イメージ
Inspector の最下位にある Sample Script 1 (Script) コンポーネントを最上位に移動する動作イメージ
コード
MoveTopInspectorComponent.cs
using UnityEditor;
using UnityEditorInternal;
using UnityEngine;
namespace Furyu.Framework.Editor
{
/// <summary>
/// インスペクタ上のコンポーネントを設定可能な最上位へ移動するEditor拡張
/// <para>
/// GetComponentsで取得したコンポーネントの順番とインスペクタの順番は同じ
/// そのため移動することでGetComponentsの結果に影響を及ぼすことに注意
/// </para>
/// </summary>
public class MoveTopInspectorComponent
{
/// <summary>
/// インスペクタ上の設定可能な最上位へ移動する
/// </summary>
/// <param name="menuCommand"></param>
[MenuItem("CONTEXT/Component/Move Top")]
private static void MoveTop(MenuCommand menuCommand)
{
var component = menuCommand.context as Component;
while (ComponentUtility.MoveComponentUp(component)) { }
}
/// <summary>
/// インスペクタ上の設定可能な最上位へ移動可能か検証
/// </summary>
/// <param name="menuCommand"></param>
/// <returns></returns>
[MenuItem("CONTEXT/Component/Move Top", true)]
private static bool ValidateMoveTop(MenuCommand menuCommand)
{
var component = menuCommand.context as Component;
var components = component.GetComponents<Component>();
// Transformコンポーネントが常に最上位(index:0)のコンポーネント
// つまりその次の位置が設定可能な最上位(index:1)
if (components[0] == component || components[1] == component)
{
return false;
}
else
{
return true;
}
}
}
}
Editor拡張適用方法については特殊なフォルダー名 - Unityマニュアル参照
さいごに
このEditor拡張により、コンポーネント移動の手間とストレスから解放されました。
今回は Inspector の最上位への移動でしたが、逆の実装をすれば最下位への移動も可能ですね。