本日はUnity枠です。
Unityで開発を行う際に特にUIなどできれいにオブジェクトを配置したい、ということがあります。
MRTKv2ではObjectCollectionと呼ばれるコンポーネントが提供されており、ある規則に従って自由にオブジェクトのレイアウトを編集できました。
このような機能を自作していきます。
〇環境
・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);//フィールドの定義 } }
実装は過去の記事を参考にしてください。
これによって次のようなフィールドが表示されます。
〇ボタンの実装とオブジェクトの子オブジェクトを均等に配置する
こんかいは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軸に対して均等にオブジェクトが配置されます。
まずはレイアウトができました。次回以降細かい調整を行います。