LoginSignup
1
0

More than 1 year has passed since last update.

Inspectorの指定コンポーネントを最上位に移動するメニュー(MoveTop)を追加してみた

Last updated at Posted at 2023-01-05

はじめに

ゲームオブジェクトにアタッチされているコンポーネントについて、自前スクリプトコンポーネントなど見やすさの観点から Inspector の最上位に移動したいことがよくあります。
その際に、コンポーネントを右クリックしてコンテキストメニューを開き Move Up を選択してポチポチ移動するのも手間がかかるし、コンポーネントをドラッグ アンド ドロップして移動するのも上手く操作できない時があるので、一気に Inspector の最上位へコンポーネントを移動してくれるメニュー(Move Top)を追加しました。

注意
Inspectorの使用 Reorder GameObject components - Unityマニュアルより

  • ゲームオブジェクトの Transform コンポーネントは常に最上位のコンポーネントのため、ここで言う Inspector の最上位 とは Transform コンポーネントの下の位置 を意味します
  • Inspector のコンポーネントの順序は GetComponents で取得したコンポーネントの順序と同じであることが保証されています

詳細

作業環境

  • Unity 2021.3.6f1
  • Unity 2020.3.20f1

操作手順

  1. Inspector の最上位に移動したいコンポーネントを
    右クリックしてコンテキストメニューを開く
  2. コンテキストメニューから Move Top を選択する
    ※既に Inspector の最上位にあるコンポーネントやTransform コンポーネントは Move Top を選択出来ません
  3. コンポーネントの位置が Inspector の最上位に移動していることを確認する

動作イメージ

Inspector の最下位にある Sample Script 1 (Script) コンポーネントを最上位に移動する動作イメージ
UnityEditorスクショ

コード

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 の最上位への移動でしたが、逆の実装をすれば最下位への移動も可能ですね。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0