いんでぃーづ

個人でゲーム開発してる上で吸収したモノたち紹介。UnityからGIMPまでなんでも。デザインとかゲーム論まで語っちゃうよ的なアレ。

MENU

Unity : 自作エディタウインドウにプレハブを擬似シリアライズ

{スポンサーリンク}
{スポンサーリンク}

エディタウインドウを自作したときに、EditorGUILayout.ObjectField で受けたプレハブ情報を保存しておく場合の方法。


EditorWindowを継承してエディタを自作した場合、データの保存には EditorPrefs を使う。

Unity - スクリプトリファレンス: EditorPrefs

が、Object型データを保存できないので、プレハブなどの情報を保存しておきたい場合、ちょっと一工夫する必要がある。

Object情報をエディタで受ける

まず EditorWindow の OnGUI 関数で以下のように書くことで、プレハブなどをインスペクタから設定できるようになる。

    prefab = EditorGUILayout.ObjectField(
        "prefab", prefab, typeof(GameObject), false) as GameObject;

    // 変数 prefab は GameObject型のメンバ変数

プレハブ情報を保存する

Object情報を直接保存することはできないので、プレハブが持つ一意なIDである GUID を保存することで、プレハブ情報を復元できる。

そこで、ObjectField で GameObject 型のプレハブを受け取ったら、AssetDatabase.GetAssetPath でプレハブのパスを取得し、そこからGUIDを取得してEditorPrefに文字列として保存する。

    string path = AssetDatabase.GetAssetPath(prefab);
    string guid = AssetDatabase.AssetPathToGUID(prefab);
    EditorPrefs.SetString("prefab_asset", guid);

プレハブ情報を復元する

保存と逆をすればよい。

    string guid = EditorPrefs.GetString("prefab_asset");
    string assetPath = AssetDatabase.GUIDToAssetPath(guid);
    GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>(assetPath) as GameObject;

・参考
Unity - スクリプトリファレンス: AssetDatabase

Amazon.co.jpアソシエイト