概要
Editor拡張でシリアライズされたフィールドにアクセスして変更するには、以下のような処理の手順を踏む必要があります。
//エディタ拡張で編集しやすいデータ形式にする
var serializedObject = new SerializedObject(GameObjectやComponentなどのインスタンス);
//データの内容が古いままのこともあるので一旦最新の状態にする
serializedObject.Update();
//変更したいシリアライズフィールドの値を取ってくる
serializedObject.FindProperty("探したいシリアライズされたフィールド名");
//シリアライズフィールド値の変更
//---何かしらの変更処理
//変更内容の更新
serializedObject.ApplyModifiedProperties();
シリアライズされたデータを変更するにはそのインスタンスが持っているシリアライズされたフィールド名が何かを調べないと変更が出来ないので、今回はコンポーネントを例に一括でフィールド名を表示出来るようにしてみました。
実装
処理の流れは以下のようになっています。
1.メニューから専用の画面を開く。
2.D&Dで確認したいコンポーネントのインスタンスを入れる。
3.一覧画面に変更できるフィールド名が表示される。
処理の中身はコメントで補足しております。
using UnityEditor;
using UnityEngine;
public class SerializedPropertyNamePreviewWindow : EditorWindow
{
private Component _previewComponent;
private Vector2 _scrollPos;
[MenuItem("Window/SerializedPropertyNamePreviewWindow")]
private static void Open()
{
GetWindow<SerializedPropertyNamePreviewWindow>();
}
private void OnGUI()
{
_previewComponent =
EditorGUILayout.ObjectField("確認したいコンポーネント", _previewComponent, typeof(Component), true) as Component;
if (_previewComponent != null)
{
EditorGUILayout.LabelField("プロパティ一覧");
//所持しているプロパティ名の一覧表示
using (var scrollScope = new EditorGUILayout.ScrollViewScope(_scrollPos, GUI.skin.box))
{
var serializedObject = new SerializedObject(_previewComponent);
var iterator = serializedObject.GetIterator();
while (iterator.NextVisible(true))
{
EditorGUILayout.LabelField(iterator.propertyPath);
}
_scrollPos = scrollScope.scrollPosition;
}
}
}
}
改善したい所
現状だと確認したいコンポーネントのインスタンスを生成する必要があって、そこが少しめんどくさいかなーと感じました。
どうにかインスタンスを使わずにType型でやり取りできたらなーいいなーとぼんやり考えていたりしますが、調べた限りできなさそう…。
お詳しい方がいればご教授いただけると幸いです。
参考
第5章 SerializedObject について
【Unity】【エディタ拡張】エディタからシリアライズされたフィールドの値を更新する方法まとめ