エディター拡張をしてみたんでMEMO
少し手の込んだことをしてみました。
- ScriptableObjectを使ったアセットを自分で作った
- アセットを自動で生成
- ディレクトリやファイルを自動で作成
- ScriptableObjectのインスペクタ―ウィンドウを変える
- 一日分時間が潰れた!
少しめちゃくちゃ遠回りをしてしまったように思います。
参考になるサイト
エディタ拡張入門エディタ拡張をしたら、インスペクターからプロパティを変更した後、一度ユニティを終了して、データが保存されているか確認した方が良いと思います。
目的:会話イベントを作りやすいようにしたかった
とりあえず:
Assetを自分でつくる。
ScriptableObjectを継承したクラスはSerialize(直列化)可能になり、Unityの普通のアセットと同じようにインスペクタ―から編集できます。
1 2 3 4 5 6 7 8 9 |
[Serializable] [CreateAssetMenu(menuName ="makeAsset")] public class TargetClass : ScriptableObject { [SerializeField] public string msg; [SerializeField] public int no; } |






インスペクタ―の画面を変える
クラスを作ります。 エディタ拡張するクラスはUnityEditor.Editorを継承する。 クラス宣言をするときに以下の属性をつける。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<span class="keyboard-key">[CustomEditor(typeof(TargetClass))]</span> <span class="keyboard-key">[CanEditMultipleObjects] //↑の属性をクラスの前につける</span> public class TargetClassEditor : UnityEditor.Editor { private void OnEnable() { } public override void OnInspectorGUI() { base.OnInspectorGUI(); } } |


まあここまでは、良かったんですが、ここから先でつまりました。 画面がうまく変わらなかったり、フォルダやファイルを作れなかったり。 一番てこずったのが、ファイルがちゃんと保存されないことでした。 ぼちぼち、必要になったとこだけ、書いていきます。
GUIレイアウト
横に並べたいとか、縦に並べたいとか、枠をつくりたいとか。 テンプレートみたいなものが、Unityで用意されているのでそれについて。 割と簡単だったりします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public override void OnInspectorGUI() { base.OnInspectorGUI(); <span style="background-color: #ccffff;">GUILayout.BeginHorizontal(GUI.skin.box);</span> <span style="background-color: #ccffff;"> //このレイアウトは横並びになる</span> <span style="background-color: #ccffff;"> GUILayout.Label("テスト");</span> <span style="background-color: #ccffff;"> GUILayout.Label("テスト");</span> <span style="background-color: #ccffff;"> GUILayout.EndHorizontal(); </span> <span style="background-color: #ffcc99;">GUILayout.BeginVertical();</span> <span style="background-color: #ffcc99;"> //このレイアウトは縦並びになる</span> <span style="background-color: #ffcc99;"> GUILayout.Label("たて");</span> <span style="background-color: #ffcc99;"> GUILayout.Label("たて");</span> <span style="background-color: #ffcc99;"> GUILayout.EndVertical();</span> } |

インプットフィールド
一番、重要な部分ですが、入力するフィールドについてです。 入力された値を、自分で作ったアセット(ScriptableObject)にいれる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[CustomEditor(typeof(TargetClass))] [CanEditMultipleObjects] public class TargetClassEditor : UnityEditor.Editor { SerializedProperty propaty; private void OnEnable() { propaty = serializedObject.FindProperty("sprite"); } public override void OnInspectorGUI() { base.OnInspectorGUI(); <span style="background-color: #ccffcc;"> EditorGUILayout.PropertyField(propaty);</span> serializedObject.ApplyModifiedProperties(); } |