【Unity】UnityEditorの基本的な使い方
Unityではエディタを拡張することができ、独自のウインドウを作成することができます。
基本的な流れ
UnityEditorを追加
using UnityEditor;
メニューに追加
[MenuItem("Window/Sample/HelloWorld")]
ウインドウを生成
EditorWindow.GetWindow<HelloWorldWindow>("TITLE")
GUIを記述
EditorWindowを拡張したクラスのOnGUIにUIを記述します。
public class HelloWorldWindow : EditorWindow{ void OnGUI(){ ... } }
主なGUI
ラベル
EditorGUILayout.LabelField("ラベル");
テキスト入力
_data.name = EditorGUILayout.TextField(_data.name);
アセット入力
ドラッグ&ドロップやファイルの選択ができます。
objTypeはAssetの型、例えば、TextAsset、Texture2D、DefaultAsset(フォルダなど)があります。
_data.textAsset = EditorGUILayout.ObjectField(_data.textAsset, typeof(TextAsset), false) as TextAsset;
ボタン
if(GUILayout.Button("OK")){ //OK }
処理を実行
OK押下後に何らかの処理を実行します。
サンプル
名前をつけて指定したデータを保存します。 UnityEditor向けのスクリプトはEditorフォルダ内に配置する必要があります。
using UnityEngine; using UnityEditor; using System.IO; public class HelloWorld{ [MenuItem("Window/Sample/HelloWorld")] public static void Main(){ EditorWindow.GetWindow<HelloWorldWindow>("File Copy"); } } public class HelloWorldData{ public string name; public TextAsset textAsset; } public class FileCopy{ public void Execute(HelloWorldData data){ if(string.IsNullOrEmpty(data.name)){ Debug.LogWarning("empty name"); return; } if(null == data.textAsset){ Debug.LogWarning("null TextAsset"); return; } //パス取得 var textAssetPath = AssetDatabase.GetAssetPath(data.textAsset); if(!File.Exists(textAssetPath)){ Debug.LogWarning("file not exists : " + textAssetPath); return; } //ファイル情報 var textAssetFileInfo = new FileInfo(textAssetPath); var directoryInfo = textAssetFileInfo.Directory; //保存 var outputPath = directoryInfo.FullName + "/" + data.name + textAssetFileInfo.Extension; var sw = new StreamWriter(outputPath, false, System.Text.Encoding.UTF8); sw.Write(data.textAsset.text); sw.Close(); Debug.Log("* save"); AssetDatabase.Refresh(); } } public class HelloWorldWindow : EditorWindow{ protected HelloWorldData _data = new HelloWorldData(); void OnGUI(){ //テキスト EditorGUILayout.LabelField("保存するファイル名"); _data.name = EditorGUILayout.TextField(_data.name); //アセット EditorGUILayout.LabelField("コピーするデータ"); _data.textAsset = EditorGUILayout.ObjectField(_data.textAsset, typeof(TextAsset), false) as TextAsset; //ボタン if(GUILayout.Button("OK")){ new FileCopy().Execute(_data); } } }