外部ファイルをスクリプトで読み込む方法をまとめます。
Unityのスクリプトから外部ファイルを読み込む方法はいろいろありますが、今回解説する方法はStreamingAssetsフォルダを用いた方法です。
そもそもAndroidアプリでCSVファイルを読み込む方法がわからず、調べるのにわりと時間がかかったのでこの記事を書きました。
Androidアプリを作りたい方は、この方法を使えば外部ファイルを読み込むことが可能になります。AndroidアプリからCSVやTXTファイルなどの外部ファイルはスクリプトから直接読み込むことができないので注意してください。
<外部ファイルを読み込む手順>
1.Asset Bundleを作成
まず読み込みたいアセットや外部ファイルをAsset Bundle化します。
そもそもAsset Bundleとは何ぞやって方のために簡単に説明しておきます。ここでの説明はこの記事を理解するための補足なのでAsset Bundleについて詳しく知りたい方は各自調べることを推奨します。
AssetとはUnityで扱う1つ1つのデータのことです。例えばCubeゲームオブジェクトや、C#スクリプト、今回読み込む外部ファイルも該当します。直訳でAsset=資産です。
そして、Asset BundleとはAssetをまとめたものです。例としては、RPGゲームのエリア用ゲームオブジェクトの集合体や、ストーリーを記録した複数のテキストファイルあたりが想像しやすいでしょう。
Asset Bundleの作成については以下の記事に詳しくまとめたので、Asset Bundleの作り方がわからない方は参考にしてください。
コーディングせずに簡単にAsset Bundle化できます。
【Unity】AssetBundleの簡単なつくり方【コード不要】
【Unity】AssetBundleの簡単なつくり方【コード不要】(adsbygoogle = window.adsbygoogle || []).push({}); Unityでコーディングを行わずにAssetBundleをつくる方法を解説します。 本記事で紹介するのは、Asset...
2.StreamingAssetsフォルダを作成しAsset Bundleを入れる
Project> Asset > StreamingAssetsを新規作成します。
この時フォルダの名前をStreamingAssetsにすることが重要です。
StreamingAssetsフォルダはアプリインストール時にプラットフォームごとに固有の場所にそのままインストールされます。
Asset BundleをStreamingAssetsフォルダへコピペしていきましょう。
Unity上でAsset Bundleを移動すると元のファイルが移動するため、保存しておきたい場合はエクスプローラー上からコピペしましょう。
Unity上ではこんな感じになっていればOK。オレンジで囲まれた真っ白のファイルがAsset Bundleたちです。
3.外部ファイルを読み込むスクリプト
下準備は完了したので、最後にStreamingAssetsフォルダに入れたAsset BundleをUnityのスクリプトから読み込みましょう。
今回はStreamingAssetsフォルダに入れたAsset Bundleのうちquestiontextを読み込みます。questiontextは元はCSVファイルです。
新しくC#スクリプト「CsvRead」を作成。
コードは以下の通り。短いので全部載せました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; public class CsvRead : MonoBehaviour { public static TextAsset csv; void Start() { string asset_name = "questiontext"; //読み込みたいAsset Bundleのname string bundleUrl = Path.Combine(Application.streamingAssetsPath, asset_name); //Asset BundleのPath if (csv == null) //複数読み込み回避 { AssetBundle assetBundle = AssetBundle.LoadFromFile(bundleUrl); //questiontextのAsset Bundleを読み込む csv = assetBundle.LoadAsset<TextAsset>("questiontext"); //assetBundle内の外部ファイルを読み込む } } } |
重要なのは以下の3点。
1 |
using System.IO; |
System.IOライブラリにより、Asset Bundleの格納されているStreamingAssetsフォルダを特定するPathを調べてくれる。Application.streamingAssetsPathが利用できるようになります。
1 |
if(csv == null){} |
Asset Bundleは、一度読み込まれた状態だと再度読み込むことができずにエラーが発生してしまいます。Asset Bundle読み込み用にSceneを使い分けるならいりませんが、Asset Bundleを読み込むSceneを複数回読み込む場合はこのif文が必要になります。
1 2 |
AssetBundle assetBundle = AssetBundle.LoadFromFile(bundleUrl); //questiontextのAsset Bundleを読み込む csv = assetBundle.LoadAsset<TextAsset>("questiontext"); //assetBundle内の外部ファイルを読み込む |
1行目、assetBundleにはAsset Bundleの型で格納されます。この状態ではまだAsset Bundle化した元のファイルとして扱えないので、2行目のassetBundle.LoadAsset<>(“読み込みたい外部ファイルの名前”)で元のファイルを読み込みます。読み込みたい外部ファイルの拡張子は記述不要です。
代わりにAsset Bundle化した元のAssetに適する型をassetBundle.LoadAsset<>()の<>の部分に入れる必要があります。
CSVファイル→TextAssetなのでassetBundle.LoadAsset<TextAsset>()となります。
あとは読み込んだ外部ファイルの処理を書いていくことができます。お疲れさまでした!
以上。最後まで読んでいただきありがとうございました。
スタートアップ・個人で作れるスマホ向け Unityソーシャルゲーム開発ガイド (Game developer books)