夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

UnityEditor拡張でオブジェクトのレイアウトを行う機能を実装する

本日はUnity枠です。

Unityで開発を行う際に特にUIなどできれいにオブジェクトを配置したい、ということがあります。

MRTKv2ではObjectCollectionと呼ばれるコンポーネントが提供されており、ある規則に従って自由にオブジェクトのレイアウトを編集できました。

redhologerbera.hatenablog.com

このような機能を自作していきます。

〇環境

Windows 11PC

・Unity2022.3.21f1

〇Editorウィンドウの実装

今回は汎用的に使用できるようにオブジェクトにアタッチするのではなくエディタウィンドウを実装します。

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

public class OpenWindow : Editor
{
    [MenuItem("Window/ObjectCollectionEditor")]
    static void GameControlMenu()
    {
        EditorWindow.GetWindow<ObjectCollection>("ObjectChangeWireFrame");
    }
}

public class ObjectCollection : EditorWindow
{
    public GameObject _TargetObj;
    void OnGUI()
    {
        //meshオブジェクトをアタッチするGUI
        GUILayout.Label("Mesh Object", EditorStyles.boldLabel);//ラベルの定義
        _TargetObj = (GameObject)EditorGUILayout.ObjectField("Mesh Object", _TargetObj, typeof(GameObject), true);//フィールドの定義  
    }
}

実装は過去の記事を参考にしてください。

redhologerbera.hatenablog.com

これによって次のようなフィールドが表示されます。

〇ボタンの実装とオブジェクトの子オブジェクトを均等に配置する

こんかいはMRTKのObjectCollection同様にアタッチした子オブジェクトのレイアウトを変えるようにします。

以下のようなコードを実装しました。

   public GameObject _TargetObj;
    void OnGUI()
    {
        //meshオブジェクトをアタッチするGUI
        GUILayout.Label("Mesh Object", EditorStyles.boldLabel);//ラベルの定義
        _TargetObj = (GameObject)EditorGUILayout.ObjectField("Mesh Object", _TargetObj, typeof(GameObject), true);//フィールドの定義
        
        if (GUILayout.Button("Execute"))
        {
            if (_TargetObj != null)
            {
                OnTargetObjectLayoutChanged();
            }
        }
    }

    public void OnTargetObjectLayoutChanged()
    {
        //_TargetObjの子オブジェクトをすべて取得して等間隔にオブジェクトを配置
        Transform[] children = _TargetObj.GetComponentsInChildren<Transform>();
        for (int i = 0; i < children.Length; i++)
        {
            children[i].position = new Vector3(i, 0, 0);
        }
        
    }

このコードを実行すると次のようにX軸に対して均等にオブジェクトが配置されます。

まずはレイアウトができました。次回以降細かい調整を行います。