1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

UnityのWebビルドでローカルのファイルを扱う方法について

Posted at

はじめに

UnityのWebビルドでは基本的にローカルのファイルに直接アクセスすることはできません。
System.IO.FileなどのAPIは使用できますが、ローカルファイルシステムへのアクセスは制限されています。
この制限はセキュリティ上の理由によるもので、Unityに限らずすべてのWebアプリケーションに共通して適用されます。

しかし、ファイルシステム APIの実験的な機能を使用することで、ローカルのファイルへのアクセスが可能になります。
本記事ではこのファイルシステム APIの概要とUnityからの使用方法について解説します。

注意:本記事で紹介する機能はChrome系ブラウザでのみ動作します。

ファイルシステム API

ファイルシステム APIはWebアプリケーションからファイルやディレクトリを扱うためのAPIです。
このAPIに含まれる window.showOpenFilePickerwindow.showDirectoryPicker を使用することで、ユーザーが選択したローカルのファイルにアクセスできます。

showOpenFilePickerの使用例
// ファイルピッカーでファイルを選択し、ファイルハンドルを取得する
const fileHandle = (await window.showOpenFilePicker())[0]

// ファイルハンドルからファイルを取得する
const file = await fileHandle.getFile()

// ファイル名を取得する
console.log(file.name)

// ファイルの内容を文字列として取得する
const text = await file.text()
console.log(text)
showDirectoryPickerの使用例
// ディレクトリピッカーでディレクトリを選択し、ディレクトリハンドルを取得する
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であるため、今後仕様が変更される可能性はあります。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?