はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】EditorUtility.Open〇〇とEditorUtility.Save〇〇を用いてファイル・フォルダ選択パネルを利用する

はじめに

今回はファイル・フォルダ選択パネルに関係する6つのメソッドについて紹介をしたいと思います。

  • EditorUtility.OpenFolderPanel
  • EditorUtility.OpenFilePanel
  • EditorUtility.OpenFilePanelWithFilters
  • EditorUtility.SaveFolderPanel
  • EditorUtility.SaveFilePanel
  • EditorUtility.SaveFilePanelInProject

EditorUtility-OpenFolderPanel - Unity スクリプトリファレンス
EditorUtility-OpenFilePanel - Unity スクリプトリファレンス
EditorUtility-OpenFilePanelWithFilters - Unity スクリプトリファレンス
EditorUtility-SaveFilePanel - Unity スクリプトリファレンス
EditorUtility-SaveFilePanelInProject - Unity スクリプトリファレンス
EditorUtility-SaveFolderPanel - Unity スクリプトリファレンス

EditorUtility.Open〇〇とSave〇〇を使った例

OpenFolderPanelとSaveFolderPanel

フォルダ選択パネルに関係したメソッドは以下の2つあります。

  • EditorUtility.OpenFolderPanel
  • EditorUtility.SaveFolderPanel
public static string OpenFolderPanel (string title, string folder, string defaultName);
public static string SaveFolderPanel (string title, string folder, string defaultName);

// OpenFolderPanel
"open folder"ダイアログを表示し、選択されたパスを取得します

// SaveFolderPanel
プロジェクトのアセットフォルダーから始まる"save folder"ダイアログを表示し、選択したファイルのパス名を取得します

具体的に説明していきます。

// サンプルコード
public class SampleWindow : EditorWindow
{
    [MenuItem("Tools/SampleWindow")]
    private static void CreateWindow()
    {
        GetWindow<SampleWindow>();
    }

    private void OnGUI()
    {
        if (GUILayout.Button("Open Folder Panel"))
        {
            var selectedPathName = EditorUtility.OpenFolderPanel(title: "Title", folder: "", defaultName: "");
            Debug.Log(selectedPathName);
            Debug.Log("Click Cancel Button: " + string.IsNullOrEmpty(selectedPathName));
        }
    }
}

キャンセルを押すと空文字を返し、フォルダを選択するとパスを返します。

Finderからフォルダを選択する(OpenFolderPanel)
Finderからフォルダを選択する(SaveFolderPanel)

MacだとOpenFolderPanelSaveFolderPanelも同じようなFinderが表示されるようですね。

引数の説明は以下の通り。

引数名 意味
title Explorer(Finder)の上に表示されるタイトル
folder 最初に選択しておくフォルダへのパス(例.Assets/Scripts,プロジェクト外は絶対パス指定)

defaultNameに関してはちゃんとした情報が出回っていなく、私自身もいくつか試してみましたがよく分かりませんでした。
一応中国の方が以下のように述べていたので載せておきます。

第三个参数defaultName:打开窗口时,“文件夹:”后的默认内容:

// DeepL翻訳
第3パラメータ defaultName:ウィンドウを開いたときの "folder: "以降のデフォルトの内容。

Unity Editor【Open Folder Panel】- 打开选择文件夹窗口并记录文件夹路径_CoderZ1010的博客-CSDN博客_openfolderpanel

OpenFilePanel(WithFilters)とSaveFilePanel(InProject)

次にFileに関連したメソッドを紹介します。

  • EditorUtility.OpenFilePanel
  • EditorUtility.OpenFilePanelWithFilters
  • EditorUtility.SaveFilePanel
  • EditorUtility.SaveFilePanelInProject
public static string OpenFilePanel (string title, string directory, string extension);
public static string OpenFilePanelWithFilters (string title, string directory, string[] filters);
public static string SaveFilePanel (string title, string directory, string defaultName, string extension);
public static string SaveFilePanelInProject (string title, string defaultName, string extension, string message);

// OpenFilePanel
"open file"ダイアログを表示し、選択されたパスを取得します

// OpenFilePanelWithFilters
"open file"ダイアログを表示し、選択されたパスを取得します

// SaveFilePanel
"save file"ダイアログを表示し、選択されたパスを取得します

// SaveFilePanelInProject
プロジェクトのアセットフォルダーから始まる"save file"ダイアログを表示し、選択したファイルのパス名を取得します

実際に使ったサンプルコードは以下の通り。

// OpenFilePanel (パネルのタイトルを"Title"にし。Assets/Scriptsフォルダを最初に開いておき、拡張子は.csのみ選択できるようにしておく)
var selectedPathName = EditorUtility.OpenFilePanel(title: "Title", directory: "Assets/Scripts", extension: "cs");
Debug.Log(selectedPathName);
Debug.Log("Click Cancel Button: " + string.IsNullOrEmpty(selectedPathName));
// OpenFilePanelWithFilters
// title : ダイアログのタイトル
// directory : デフォルトディレクトリ
// filters : 対象の拡張子(複数種類の拡張子を指定できる).なんでこんな指定方法にしたの...
var selectedPathName = EditorUtility.OpenFilePanelWithFilters(title: "Title", directory: "Assets/Scripts", filters: new[] {
    "Image files", "png,jpg,jpeg",
    "Scripts files", "cs" 
});
Debug.Log(selectedPathName);
Debug.Log("Click Cancel Button: " + string.IsNullOrEmpty(selectedPathName));
// SaveFilePanel
var selectedPathName = EditorUtility.SaveFilePanel(title: "Title", directory: "Assets/Scripts", defaultName: "Sample.cs", extension: "cs");
Debug.Log(selectedPathName);
Debug.Log("Click Cancel Button: " + string.IsNullOrEmpty(selectedPathName));
// SaveFilePanelInProject
var selectedPathName = EditorUtility.SaveFilePanelInProject(title: "Title", defaultName: "Sample.cs", extension: "cs", message: "Message");
Debug.Log(selectedPathName);
Debug.Log("Click Cancel Button: " + string.IsNullOrEmpty(selectedPathName));
OpenFilePanel
OpenFilePanelWithFilters
SaveFilePanel
SaveFilePanelInProject

EditorUtility.OpenFilePanelWithFiltersfilters"説明", "拡張子"みたく記述するようです。なんでこんなめんどくしたのかは謎です。

さいごに

EditorUtilityは名前の通りUnityEditor.dll入っているので、エディタ上でないと動作しません。注意してください。
docs.unity3d.com