MRが楽しい

MRやVRについて学習したことを書き残す

StreamingAssetsフォルダからデータを一時フォルダに移動してアプリで編集可能な参照ファイルを作成する

本日は Unity の小ネタ枠です。
StreamingAssets フォルダからデータを一時フォルダに移動してアプリで編集可能な参照ファイルを作成する方法を記事にします。

StreamingAssetsフォルダ

StreamingAssets フォルダはデータファイルを非圧縮のまま展開先のアプリに格納するためのフォルダです。Unity プロジェクトの本フォルダに保存しているデータは展開先のアプリでも同じように参照できます。
利用手順などの詳細は以下の前回記事を参照ください。
bluebirdofoz.hatenablog.com

一時フォルダ

PersistentDataPath はアプリが実行中に保持するデータを格納できるディレクトリパスです。
アプリのプラットフォームによって異なるディレクトリを参照します。
docs.unity3d.com

StreamingAssetsフォルダと違い、一時フォルダは多くのプラットフォームで書き込み可能な領域です。

サンプルプロジェクト

前回の StreamingAssets フォルダの確認プロジェクトを改変して一時フォルダの動作を確認するプロジェクトを作成しました。

以下の通り、一時フォルダに参照データがない場合は StreamingAssets フォルダからファイルをコピーし、一時フォルダにコピーされたファイルを参照するようにコードを修正しました。
・ImageLoadTest.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(ImageLoader))]
public class ImageLoadTest : MonoBehaviour
{
    // 画像名
    const string PictureFileName = "HoloMon.png";

    // 一時フォルダ画像パス
    string TempPictureFilePath => System.IO.Path.Combine(Application.persistentDataPath, PictureFileName);

    // StreamingAssetsフォルダ画像パス
    string StreamingAssetsPictureFilePath => System.IO.Path.Combine(Application.streamingAssetsPath, PictureFileName);

    void Start()
    {
        // 一時フォルダに画像が存在しない場合は StreamingAssets からデフォルト画像をコピーしておく
        if (!System.IO.File.Exists(TempPictureFilePath))
        {
            System.IO.File.Copy(StreamingAssetsPictureFilePath, TempPictureFilePath);
        }

        // 一時フォルダからファイルを読み込んで表示する
        this.gameObject.GetComponent<ImageLoader>().SetTextureForPanel(TempPictureFilePath);
    }
}

これにより初期起動ではデフォルト画像を表示しつつ、一時フォルダのデータを差し替えることで表示画像を差し替えることも可能になります。

動作確認

プロジェクトを HoloLens2 にデプロイして動作を確認してみます。
初回起動時には StreamingAssets 内の画像が一時フォルダにコピーされ、アプリはその画像を参照して表示を行います。

一時フォルダ内の画像ファイルを差し替えてみます。

アプリを改めて起動してみると、以下の通り差し替えた画像が表示されました。