■はじめに
UnityでPhotoshopで画像を読み込むときと同じように、拡張子を選択するとその拡張子のファイルのみが表示されるような挙動をランタイムで動くように実装したかったでのやってみた。
■環境
Unity 6000.0.23f1
参考
- 最シンプルでランタイムで動かす場合の参考元(今回は別のやり方)
■使わせてもらうもの
ここのDownload Packageから.unitypackageをゲッチュ。
■コード
/// <summary>
/// 一つだけ選択されたファイルのパスを返す
/// </summary>
/// <param name="_title">(*1)で表示される文字</param>
/// <param name="_openPath">(*2)最初に開くパス</param>
/// <param name="_extensions">(*3)選択できる拡張子一覧</param>
/// <returns>選択されたファイルのパス</returns>
public string OpenAndGetFilePath(string _title,string _openPath, string[] _extensions)
{
// 表示するファイルの拡張子を設定
var extensions = new[]
{
//第一引数は拡張子の説明用名前、第二引数はstring[]なので、
//以下の様に拡張子を直に指定しても、この関数の_extensionsを使っても良い。
//_extensionsを使う場合は、[png][jpg][jpeg]の様な任意の拡張子を指定するstringの配列になっている必要がある
new ExtensionFilter("Image Files", "png", "jpg", "jpeg", "bmp"),
// new ExtensionFilter("Image Files", _extensions),
};
//ここでエクスプローラーを開いて、選択されたファイルのパスが返ってくる。
//OpenFilePanelAsyncにして、コールバック関数を指定するやり方もできる。
string[] paths = StandaloneFileBrowser.OpenFilePanel(_title, _openPath, extensions, false);
// StandaloneFileBrowser.OpenFilePanelAsync(_title, _openPath, extensions, false, paths =>
// {
// if (paths != null && paths.Length > 0)
// {
// UnityEngine.Debug.Log($"指定されたファイルのパス => {paths[0]}");
// }
// });
if (paths.Length > 0 && !string.IsNullOrEmpty(paths[0]))
{
UnityEngine.Debug.Log($"選択したファイルのパス => {paths[0]}");
return paths[0];
}
//ファイルが選択されずにキャンセル等された場合も含まれる
UnityEngine.Debug.LogWarning($"パスが異常でした => {paths}");
return "";
}
(*1)_title
(*2)_openPath
開くフォルダ。
ここでは画像を選択させるためにピクチャーフォルダを開きたかったので、以下の様に指定している。
var openPath = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);
(*3)_extensions
こんな感じで指定している。
var extensions = new string[]
{
"png",
"jpg",
"jpeg",
"bmp",
};
拡張
- 今回は1ファイルのみ選択してほしい状況だったので、StandaloneFileBrowser.OpenFilePanelの第三引数はfalseになっていますが、これをtrueにすると複数ファイルまとめて選択ができます。
- もしPhotoshopみたいに拡張子の説明名と拡張子を何個も設定したい場合は、
ExtensionFilterの数を増やせばOK。
拡張子の説明名と拡張子リストをセットで構造体等にまとめてリスト等で渡したらこれができる。
最後に
最近成城石井で買ってみたTEARTHのはちみつチャイが美味しい。