はじめに
UnityのWebビルドでは基本的にローカルのファイルに直接アクセスすることはできません。
System.IO.FileなどのAPIは使用できますが、ローカルファイルシステムへのアクセスは制限されています。
この制限はセキュリティ上の理由によるもので、Unityに限らずすべてのWebアプリケーションに共通して適用されます。
しかし、ファイルシステム APIの実験的な機能を使用することで、ローカルのファイルへのアクセスが可能になります。
本記事ではこのファイルシステム APIの概要とUnityからの使用方法について解説します。
注意:本記事で紹介する機能はChrome系ブラウザでのみ動作します。
ファイルシステム API
ファイルシステム APIはWebアプリケーションからファイルやディレクトリを扱うためのAPIです。
このAPIに含まれる window.showOpenFilePicker や window.showDirectoryPicker を使用することで、ユーザーが選択したローカルのファイルにアクセスできます。
// ファイルピッカーでファイルを選択し、ファイルハンドルを取得する
const fileHandle = (await window.showOpenFilePicker())[0]
// ファイルハンドルからファイルを取得する
const file = await fileHandle.getFile()
// ファイル名を取得する
console.log(file.name)
// ファイルの内容を文字列として取得する
const text = await file.text()
console.log(text)
// ディレクトリピッカーでディレクトリを選択し、ディレクトリハンドルを取得する
const directoryHandle = await window.showDirectoryPicker()
// ディレクトリ内のエントリを列挙する
for await (const [name, handle] of directoryHandle.entries()) {
// エントリの名前
console.log(name)
// エントリの種類(file or directory)
console.log(handle.kind)
// エントリのハンドル
console.log(handle);
}
ローカルのファイルにアクセスする場合、基本的にこれらのメソッドが起点になるので 最初は必ずユーザーによる選択が必須になります。
一度選択されたものはページから離れるまでは使用できますが、一度離れてから再度ページにアクセスした場合は再度ユーザーに選択させる必要があります。
また、Chrome系のブラウザでしか動かず、SafariやFirefoxなどのブラウザでは動きません。
UnityのWebビルドから使用する方法
UnityのWebビルドではJavaScriptプラグインを使用してC#のコードから任意のJavaScriptメソッドを実行できます。
参考: Set up your JavaScript plug-in
ファイルシステムAPIを使用するプラグインを作成することで、UnityのWebビルドからローカルのファイルにアクセスできるようになります。詳細な実装方法については上記のドキュメントを参照してください。
UnityWebFileSystem
ファイルシステムAPIをUnityから簡単に使用できるように、UnityWebFileSystemというパッケージを公開しています。
自分でプラグインを作成する手間を省きたい場合は、このパッケージが利用できます。
このパッケージを使用すると、JavaScriptでファイルシステムAPIを使用する場合と同様の感覚で、コードを書くことができます。
async UniTask ReadFileExample(CancellationToken cancellationToken)
{
// ファイルピッカーでファイルを選択し、ファイルハンドルを取得する
using var fileHandle = await GenericFileSystem.ShowOpenSingleFilePickerAsync(cancellationToken);
// ファイルハンドルからファイルを取得する
using var file = await fileHandle.GetFileAsync(cancellationToken);
// ファイルの内容を文字列として取得する
var bytes = await file.BytesAsync(cancellationToken);
var text = Encoding.UTF8.GetString(bytes);
Debug.Log($"File: {file.Name()}, Size: {file.Size()}, Content: {text}");
}
自分でプラグインを作成したい場合は、以下の実装ファイルが参考になります。
まとめ
本記事ではファイルシステムAPIを使用してUnityのWebビルドからローカルのファイルにアクセスする方法を解説しました。
通常のアプリビルドと比べると多くの制約がありますが、直接ローカルのファイルを参照、保存できるのはツールの作成などに役立つかもしれません。
実験的なAPIであるため、今後仕様が変更される可能性はあります。