Unityでは通常、アプリケーションに関連するファイルが結合され、後からファイルを追加したり設定ファイルを変更できません。でも、それだとMODの仕組みを作ったり設定ファイルを作ったりできず不便ですよね。Unityの場合はStreamingAssetsフォルダを用意することで解決できますのでやり方を紹介します。
手順の概要
- UnityプロジェクトにAssets/StreamingAssetsフォルダを追加する
- 読み込みたいファイルをStreamingAssetsフォルダに配置する
- C#スクリプトでApplication.streamingAssetsPathを使いパスを指定する
StreamingAssetsフォルダについては公式ドキュメントをご参照ください。

ストリーミングアセット - Unity マニュアル
Unity はビルド時に必要なアセットをプロジェクトに結合します。しかし、場合によってはターゲットとなるマシンの標準的なファイルシステム上にデータを配置し、パス名で参照した方がよい事もあります。例えば iOS 上で動画ファイルを展開する場合...
手順
Assets/StreamingAssetsフォルダを作成します。このフォルダに任意のファイルを読み込みますが、今回はJSON形式のファイルを格納しました。

C#スクリプトを作成し、シーン内のオブジェクトにアタッチしておきます。今回はGameControllerという空オブジェクトを作成しアタッチしています。

VisualStudioでスクリプトを編集します。キャプチャの下にテキストを記載しています。StreamingAssetsフォルダはApplication.streamingAssetsPathで取得できることが分かります。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System.Text;
public class ImportFromStreamingAssets : MonoBehaviour
{
ApplicationSetting setting;
void Start()
{
var setting_file_fullname = Path.Combine(Application.streamingAssetsPath, "setting.json");
Debug.Log("setting file : " + setting_file_fullname);
using(FileStream fs = new FileStream(setting_file_fullname, FileMode.Open, FileAccess.Read))
using(StreamReader sr = new StreamReader(fs, Encoding.UTF8))
{
setting = JsonUtility.FromJson<ApplicationSetting>(sr.ReadToEnd());
Debug.Log($"name:{setting.name}, list:{setting.inner.value_list[0]}");
}
}
}
[System.Serializable]
public class ApplicationSetting
{
public string name;
public InnerSetting inner;
}
[System.Serializable]
public class InnerSetting
{
public string version;
public List<string> value_list;
}
実行するとStreamingAssetsフォルダの位置と、読み込んだJSONファイルの中身を取り出せたことが確認できました。次はアプリをビルドしてフォルダの場所とファイルの確認を行います。

アプリをビルドして、ビルド先/<アプリケーション名>_Data/StreamingAssetsフォルダを見ると未結合のファイルがそのまま格納されていることが確認できました。

今回はテキスト形式のファイルでしたが、FBXや画像など他のファイルについては分かり次第記事を追加していきます。
コメント