結構必要になる感じの機能。ファイルを指定するボタンです。
これは「ボタンを押す→ファイルを指定する→そのパスを保存する」という流れで、
最後には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で描画させると出てきます。