LoginSignup
18
13

More than 5 years have passed since last update.

UnityEditorのObjectFieldの値を保持したい

Posted at

ObjectField

UnityEditorでObjectFieldを使うと、ユーザがオブジェクトを設定できるフィールドを用意できる。
例えば、ImageのSource Imageを指定するようなやつ。

image_sprite.png

こんな感じで利用できる

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状態が変わっても値が保持されるようになった。

sample.gif

18
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
13