2018/6/9前回の続きエディタ拡張をしたら、インスペクターからプロパティを変更した後、一度ユニティを終了して、データが保存されているか確認した方が良いと思います。エディタ拡張をするとき、SerializedPropertyを使わずにやろうとするとなんかよくわからなくなりました。したら、遠回りをしているのかも。出来たんで、MEMO。わかりにくいかもしれませんが。自作アセットのListを持っているアセットがあって、そのListのアセットもインスペクタ―から変更できるようにしたかったんです。+ボタンを押せば、フォルダの中に自動でファイルが作られるように。いちいちアセットを選択する手間を省きたかった。困ったことファイルのパスの取得がうまくできない。アセットのスクリプトからの作り方がわからなかった。SerializedPropertyが使えないはず。前回までの記事で、1と2については書きました。のこり二つを書いていきます。3.SerializedPropertyが使えないはず。できないと思うんですけど。ターゲットのオブジェクトが持つプロパティがあって、それがScriptableObjectだったとき。#ccffcc;">}</span>僕が使ったのもこんな感じのフィールドを持つクラスだったんですが、このmyAssetListにインスペクタ―からアクセスできるようにしたかったんです。いちいち選択するのが面倒だったので。FindProperty("myAssetList")でこれ自体はSerializedPropertyとして取得できます。List<MyAsset>としては扱えない、はず。型をキャストすることもできませんでした。(TargetClass)serializedObject.targetObject;}こんな感じですれば、選択中のアセットをそのまま取得できます。このtargetを参照しながら、EditorGUILayoutを使って、インスペクタ―の画面を作っていきます。EditorGUILayout.EndHorizontal();</span>}EditorGUILayout.EndVertical();}OnEnable()はインスペクタ―を開いたときに呼ばれます。OnEnable()内で編集中のアセットを取得する必要があります。serializedObject.targetObjectが編集中のオブジェクトになります。これを型キャストすれば取得できます。GUIを作りますが、SerializePropatyを使わない場合、これが面倒です。EditorGUILayout.ObjectField()オブジェクトの入力欄です。2番目の引数に、参照するオブジェクトのタイプを入れます。例ではSpriteにしています。3番目の引数のbool値はシーンからドロップされたオブジェクトをセットできるようにするかの値です。これを入れないと旧型式だとか言われて、なんかだめです。取得するときに、型をキャストします。見るオブジェクト入力フィールドができました。これだけでは未完成です。4.保存されない使ってみます。自分で作ったオブジェクトフィールドから、我らがアイドルゆにてぃちゃんを選択。一度開いたとき、消えています。この辺で、詰まりました。解決策:SetDirty()を追加します。注:Unity5.3以前では変わっているかも。僕は2017.3.1です。#ffcc99;">EditorUtility.SetDirty(row);</span>}EditorGUILayout.EndVertical();}この色付きが追加した部分。このSetDirtyの引数に変更したオブジェクトを入れます。例の場合、(TargetClass)serializedObject.targetObjectを入れても保存されません。TargetClass自体が持っているフィールドは保存されますが、フィールドのフィールド(この場合だとforeach中のrow)までは保存されません。わかってみれば当たり前なのかもしれませんが、これがわからなくて散々迷いました。あと、このままだと元に戻す処理ができません。その場合はこちらの第12章あたりが参考になります。上手く保存されなかったりした場合、上記リンクにあるUndo処理も記述する必要があるかもしれません。以上で詰まったところは書き終わりました。あとはAssetDatabaseなんかを応用して、ファイルが自動で作られたりするようにしました。その辺は、個別に考えるしかないと思います。そんな感じで、エディタ拡張でした。エディタ拡張としては、地味な変更だったかもしれませんが、非常に苦労しました。言って何もせずにそのまま変えた方がよかったんじゃないかと思うくらい。完成したら、まあ便利だったんでやって良かったと思いましたけど。慣れてきたらちょっとした入力補助は簡単にできそうです。こまかく設定できるように、Unity側が用意してくれていますし。