[Unityエディター拡張] ファイルを選択するボタンを作る

ヨメレバCSS
オリジナルCSS


※本サイトはアフィリエイトプログラムによる収益を得ています。
 ページ内のリンクがアフィリエイトリンクの場合があります。

結構必要になる感じの機能。ファイルを指定するボタンです。

これは「ボタンを押す→ファイルを指定する→そのパスを保存する」という流れで、

最後にはstring型につける属性としています。

[SerializeField, FilePath]
private string filepath;

[SerializeField, FilePath("sln")]
private string filepath2;

こういう指定をすると、

4_1_filepath

こうなる感じで。

コードは次のように。解説はコメントにあります。

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で描画させると出てきます。

スポンサーリンク
GoogleAdSence レクタングル(大)

シェアする

スポンサーリンク
GoogleAdSence レクタングル(大)