エディタ拡張をしたら、インスペクターからプロパティを変更した後、一度ユニティを終了して、データが保存されているか確認した方が良いと思います。
エディタ拡張をするとき、SerializedPropertyを使わずにやろうとするとなんかよくわからなくなりました。 ひょっとしたら、遠回りをしているのかも。 とりあえず、出来たんで、MEMO。
注:動画容量大です。
ちょっとわかりにくいかもしれませんが。
自作アセットのListを持っているアセットがあって、そのListのアセットもインスペクタ―から変更できるようにしたかったんです。
そして+ボタンを押せば、フォルダの中に自動でファイルが作られるように。
いちいちアセットを選択する手間を省きたかった。
困ったこと
- ファイルのパスの取得がうまくできない。
- アセットのスクリプトからの作り方がわからなかった。
- SerializedPropertyが使えないはず。
- 保存されない。
3.SerializedPropertyが使えないはず。
たぶんできないと思うんですけど。 ターゲットのオブジェクトが持つプロパティがあって、それがScriptableObjectだったとき。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public class TargetClass : ScriptableObject { [SerializeField] public string msg; [SerializeField] public int no; <span style="background-color: #ccffcc;">[SerializeField]</span> <span style="background-color: #ccffcc;">public List<MyAsset> myAssetList;</span> } <span class="keyboard-key">[CreateAssetMenu(menuName =("createMyAsset"))]</span> <span style="background-color: #ccffcc;">public class MyAsset : ScriptableObject{</span> <span style="background-color: #ccffcc;"> [SerializeField]</span> <span style="background-color: #ccffcc;"> public Sprite m_Sprite;</span> <span style="background-color: #ccffcc;"> [SerializeField]</span> <span style="background-color: #ccffcc;"> public AudioClip m_Clip;</span> <span style="background-color: #ccffcc;">}</span> |
どうするか?
1 2 3 4 5 6 |
public class TargetClassEditor : UnityEditor.Editor { TargetClass target; private void OnEnable() { target = (TargetClass)serializedObject.targetObject; } |
オブジェクト入力フィールド
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
List<MyAsset> myAssetList; private void OnEnable() { <span style="background-color: #ffcc00;">TargetClass target = (TargetClass)serializedObject.targetObject;</span> myAssetList = target.myAssetList; } public override void OnInspectorGUI() { base.OnInspectorGUI(); EditorGUILayout.BeginVertical(); foreach(var row in myAssetList) { <span style="background-color: #ccffff;">EditorGUILayout.BeginHorizontal();</span> <span style="background-color: #ccffff;"> EditorGUILayout.LabelField("m_Clip");</span> <span style="background-color: #ccffff;"> row.m_Clip = (AudioClip)EditorGUILayout.ObjectField(</span> <span style="background-color: #ccffff;"> row.m_Clip, typeof(AudioClip), true);</span> <span style="background-color: #ccffff;"> EditorGUILayout.EndHorizontal();</span> <span style="background-color: #ffff99;">EditorGUILayout.BeginHorizontal();</span> <span style="background-color: #ffff99;"> EditorGUILayout.LabelField("m_Sprite");</span> <span style="background-color: #ffff99;"> row.m_sprite = (Sprite)EditorGUILayout.ObjectField(</span> <span style="background-color: #ffff99;"> row.m_sprite, typeof(Sprite), true);</span> <span style="background-color: #ffff99;"> EditorGUILayout.EndHorizontal();</span> } EditorGUILayout.EndVertical(); } |
EditorGUILayout.ObjectField()
オブジェクトの入力欄です。 2番目の引数に、参照するオブジェクトのタイプを入れます。例ではSpriteにしています。 3番目の引数のbool値はシーンからドロップされたオブジェクトをセットできるようにするかの値です。これを入れないと旧型式だとか言われて、なんかだめです。 取得するときに、型をキャストします。 これで、
4.保存されない
使ってみます。

この辺で、詰まりました。
解決策:
SetDirty()を追加します。注:Unity5.3以前では変わっているかも。僕は2017.3.1です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public override void OnInspectorGUI() { base.OnInspectorGUI(); EditorGUILayout.BeginVertical(); foreach(<span style="background-color: #99ccff;">var row</span> in myAssetList) { EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("m_Clip"); row.m_Clip = (AudioClip)EditorGUILayout.ObjectField( row.m_Clip, typeof(AudioClip), true); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("m_Sprite"); row.m_sprite = (Sprite)EditorGUILayout.ObjectField( row.m_sprite, typeof(Sprite), true); EditorGUILayout.EndHorizontal(); <span style="background-color: #ffcc99;">EditorUtility.SetDirty(row);</span> } EditorGUILayout.EndVertical(); } |
以上で詰まったところは書き終わりました。 あとはAssetDatabaseなんかを応用して、ファイルが自動で作られたりするようにしました。その辺は、個別に考えるしかないと思います。
そんな感じで、エディタ拡張でした。 エディタ拡張としては、地味な変更だったかもしれませんが、非常に苦労しました。はっきり言って何もせずにそのまま変えた方がよかったんじゃないかと思うくらい。 完成したら、まあ便利だったんでやって良かったと思いましたけど。 慣れてきたらちょっとした入力補助は簡単にできそうです。 こまかく設定できるように、Unity側が用意してくれていますし。 やっぱりUnityすごい。開発環境すごい。 エディタ拡張したので、MEMO。