ObjectField
UnityEditorでObjectFieldを使うと、ユーザがオブジェクトを設定できるフィールドを用意できる。
例えば、ImageのSource Imageを指定するようなやつ。
こんな感じで利用できる
example
GameObject gameObject = null;
gameObject = EditorGUILayout.ObjectField(
"FieldSelector",
gameObject,
typeof(GameObject),
true
) as GameObject;
ここで問題なのはこのまま利用していると、EditorのPlayの状態が変更されるたびにObjectFieldで取得した値が保持されなくなってしまうこと。
これを保持できるように解決したい。
EditorPrefs
UnityEditor用の永続的なデータ保持の手段として、EditorPrefsがある。
これはPlayerPrefsと同じように利用できる。
ここにObjectFieldで取得したGameObjectのInstanceIDを保持しておけば、EditorのPlay状態が変わっても保持していられる。
// 保存
int id = gameObject.GetInstanceID();
EditorPrefs.SetInt("sample_id", id);
// 読み出し
int id = EditorPrefs.GetInt("sample_id", -1);
gameObject = EditorUtility.InstanceIDToObject(this.SelectedInstanceId) as GameObject;
コード
全体はこんな感じになる。
ObjectFieldSampleWindow.cs
using UnityEditor;
using UnityEngine;
public class ObjectFieldSampleWindow : EditorWindow
{
[MenuItem("Custom/ObjectFieldSample")]
static void Init()
{
var window = EditorWindow.GetWindow<ObjectFieldSampleWindow>();
window.Show();
}
private GameObject _gameObject;
private int _id = -1;
void OnGUI()
{
this._gameObject = this.LoadObject(this._id);
this._gameObject =
EditorGUILayout.ObjectField(
"Sample",
this._gameObject,
typeof(GameObject),
true
) as GameObject;
this._id = this.SaveObject(this._gameObject);
}
GameObject LoadObject(int id)
{
if (id == -1)
{
id = EditorPrefs.GetInt("sample_id", -1);
if (id != -1)
{
return EditorUtility.InstanceIDToObject(this._id) as GameObject;
}
}
return this._gameObject;
}
int SaveObject(GameObject obj)
{
if (obj != null)
{
int id = obj.GetInstanceID();
EditorPrefs.SetInt("sample_id", id);
return id;
}
return -1;
}
}
結果
Play状態が変わっても値が保持されるようになった。