Editor拡張からPrivateな変数にアクセスしたい
using UnityEngine;
//編集対象のテストクラス
public class BlogTest : MonoBehaviour
{
public enum Mode
{
STAY,
WALK,
RUN
}
[SerializeField] private int _number;
[SerializeField] private bool _isPlay;
[SerializeField] private Mode _mode;
[SerializeField] private string[] _array;
void Start()
{
}
void Update()
{
}
}
このスクリプトは、シリアライズされたPrivate変数のアクセスをテストするためのスクリプトです。
特に意味のないクラスなので、自前でPrivateな変数にアクセスしたいスクリプトがある場合は、このスクリプトは必要ありません!
Editor拡張スクリプト
using UnityEngine;
using UnityEditor;
//BlogTestのインスペクターの見た目を編集するスクリプト
[CustomEditor(typeof(BlogTest))]
public class ExampleBlogTestEditor : Editor
{
public override void OnInspectorGUI()
{
base.OnInspectorGUI(); //元のInspectorの内容を表示するのに必要
//Inspectorにボタンを表示する
if (GUILayout.Button("PrivateValueChange"))
{
ValueChange();
}
}
private void ValueChange()
{
SerializedObject serialized = new SerializedObject(target); //targetで対象コンポーネントを取得
//intの値を更新
SerializedProperty numberProperty = serialized.FindProperty("_number"); //シリアライズされた変数(プロパティ)を取得する
numberProperty.intValue = 100;
//boolの値を更新
SerializedProperty isPlayProperty = serialized.FindProperty("_isPlay"); //シリアライズされた変数(プロパティ)を取得する
isPlayProperty.boolValue = true;
//Enumの値を更新
SerializedProperty modeProperty = serialized.FindProperty("_mode"); //シリアライズされた変数(プロパティ)を取得する
modeProperty.intValue = (int)BlogTest.Mode.RUN;
//配列の要素を更新
SerializedProperty arrayProperty = serialized.FindProperty("_array"); //シリアライズされた変数(プロパティ)を取得する
for (int i = 0; i < arrayProperty.arraySize; i++)
{
SerializedProperty arrayElement = arrayProperty.GetArrayElementAtIndex(i); //シリアライズされた配列の要素を取得する
arrayElement.stringValue = "更新";
}
serialized.ApplyModifiedProperties(); //編集内容を適応
}
}
このスクリプトは、BlogTestクラスのInspectorの表示を編集するスクリプトです。
拡張内容としては、ボタンを押した時にシリアライズされた変数の値を更新するだけの、シンプルな内容となっています。
SerializedObjectとして編集対象を取得する
SerializedObject serialized = new SerializedObject(target); //targetで対象コンポーネントを取得
シリアライズされたPrivateな変数を編集するためには、対象のObjectをSerializedObjectとして取得することで編集が可能になります。
Private変数の値を更新する
SerializedProperty numberProperty = serialized.FindProperty("_number"); //シリアライズされた変数(プロパティ)を取得する
numberProperty.intValue = 100; //値を更新
SerializedObjectを取得したら、FindProperty関数を使って、変数のプロパティを取得します。
int型の変数の値を更新したい場合は、intValueで値を更新することが出来ます。
他の型については、サンプルのスクリプトでよく使いそうな変数を記述しているので、見てみてください!
編集内容を保存する
serialized.ApplyModifiedProperties(); //編集内容を適応
値を更新した後は、変更した内容をInspectorに適応する必要があります。
値を更新した後に、ApplyModifiedPropertiesを呼ばないとInspectorに値が反映されないので、値の更新が発生したときは、セットで呼ぶようにしましょう。
あとは、実際に値を更新してみて、Inspectorの値が変わっているかを確認してみてください!
お疲れさまでした!