18
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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
12
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
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?