結構必要になる感じの機能。ファイルを指定するボタンです。
これは「ボタンを押す→ファイルを指定する→そのパスを保存する」という流れで、
最後にはstring型につける属性としています。
[SerializeField, FilePath] private string filepath; [SerializeField, FilePath("sln")] private string filepath2;
こういう指定をすると、
こうなる感じで。
コードは次のように。解説はコメントにあります。
using UnityEngine; using System.Collections; public class FilePathAttribute : PropertyAttribute { /// <summary> /// ダイアログの拡張子フィルタ /// </summary> public string extensionFilter; /// <summary> /// コンストラクタ /// /// フィルタの指定が無かった場合は空文字列にする /// </summary> public FilePathAttribute(string extensionFilter = "") { if( string.IsNullOrEmpty(extensionFilter) ) { extensionFilter = ""; } this.extensionFilter = extensionFilter; } }
using UnityEngine; using System.Collections; using UnityEditor; [CustomPropertyDrawer(typeof(FilePathAttribute))] public class FilePathDrawer : PropertyDrawer { public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { if ( property.propertyType != SerializedPropertyType.String ) { EditorGUI.HelpBox(position, "This attribute is a string only.", MessageType.Error); return; } EditorGUI.BeginProperty(position, label, property); Rect buttonPosition = new Rect(position.x+position.width-30, position.y, 30, position.height); Rect textPosition = new Rect(position.x, position.y, position.width-buttonPosition.width-5, position.height); EditorGUI.TextField(textPosition, label, property.stringValue); if (GUI.Button(buttonPosition, "...")) { string dirpath = ""; // ファイルが存在していたら、そのディレクトリを開く if( System.IO.File.Exists(property.stringValue) ) { dirpath = System.IO.Path.GetDirectoryName(property.stringValue); } FilePathAttribute filepath = (FilePathAttribute)attribute; string path = EditorUtility.OpenFilePanel("select file", dirpath, filepath.extensionFilter); if ( false == string.IsNullOrEmpty(path) ) { // ファイルが選択されていたらそれを反映させる property.stringValue = path; } } EditorGUI.EndProperty(); } }
ざっくりとした流れとしては、TextFieldで現在の値を表示して、ボタンが押されたらOpenFilePanelで選択ダイアログを出し、その結果を反映させるというものです。
TextFieldは選択とパスの入力が直接できるようにと思って使ってみました。
FilePathAttributeのコンストラクタで、拡張子のフィルタを指定できるようにしています。
またstring型以外にはつけられないようにしています。
OnInspectorGUIで使いたいときは、
[SerializeField, FilePath] private string filepathValue;
というようにFilePath属性をつけておいて、
EditorGUILayout.PropertyField(serializedObject.FindProperty("filepathValue"), new GUIContent("filepath"));
PropertyFieldで描画させると出てきます。