kiyasuの日記

ハッピーうれピーよろしく哀愁

Unityのinspectorにボタン置く

UnityのEditorスクリプトの書き方。Inspector上にボタンを表示して、押したらPlay中pause中に関わらず何かしら処理をしてくれるようになるやつです。

f:id:mojo_nobu:20211209025232p:plain

例として「ボタンを押したら、アタッチされているオブジェクトの子の順番が変わる」スクリプトを作りました。

  • Editorフォルダ以下にReverseTransformOrderEditor.csを置く
  • 特殊フォルダじゃない場所にReverseTransformOrder.csを置く

としてください。

everseTransformOrder.csがInspector上でオブジェクトにアタッチされるガワになり、ボタンの表示と実際の処理はReverseTransformOrderEditor.csで行ってます。

ReverseTransformOrderEditor.cs

using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(ReverseTransformOrder))]
public class ReverseTransformOrderEditor : Editor
{
    ReverseTransformOrder reverseTransformOrder = null;
    private void OnEnable()
    {
        reverseTransformOrder = target as ReverseTransformOrder;
    }

    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();

        if (GUILayout.Button("逆順に並び変え"))
        {
            var transformCount = reverseTransformOrder.transform.GetChildCount();
            List<Transform> distTransformList = new List<Transform>();

            for (int index = transformCount - 1; index >= 0; index--) // 後ろから
            {
                var currentTransform = reverseTransformOrder.transform.GetChild(index);
                currentTransform.SetParent(null);
                distTransformList.Add(currentTransform);

            }

            // 再配置
            foreach (var t in distTransformList)
            {
                t.SetParent(reverseTransformOrder.transform);
            }
        }

    }
}

ReverseTransformOrder.cs

using UnityEngine;

public class ReverseTransformOrder : MonoBehaviour
{
  // この例では何も書く必要なし
}