【Unity】AddressableAssetSystemでCSVを読込む

体重管理アプリの修正でフラフラになっているケロです。

Androidにビルドすると、いろいろと問題点が出てきます。
・機種によって画面サイズが変わる
・InputFieldの入力設定で思った入力ができない
・もっと便利に扱えるといい

画面サイズは、永遠の課題なんですが、
まさか、InputFieldがおかしな事になるとは予想外でした。

嫁に使ってもらってカレンダーがスワイプで切り替えれない…
こんな意見がでて、修正案を考えている毎日でっす。(;^_^A アセアセ


さて、前置きはこれくらいにして…

体重管理アプリをAndroidにテストビルドした時の事なんですが、
CSVファイルが読み込まれない現象が起きました。

システム上の問題点
・ファイル名取得の為、フォルダ内を検索して有無を判断する
・apkに圧縮するとResourcesのパスが変わる

テストビルドの時は、Resourcesを使っていました。
正規として使う場合は、Application.persistentDataPathを使って、
パッケージにファイルを保管するので問題はないのですが…

apkにするとResourcesも圧縮される為、
パスが変わるので、Unity上で受け付けていたパスが通らなくなり、
検索の際にファイルが見つからないと判断されて読込みが行われなかった訳です。

読込みだけなら、Resources.Loadでアクセスできるので、
問題ないのですが、書き込みやファイル検索などの場合は、
どうすればいいのかな?と疑問に思って調べてみました。

・apkに圧縮するとResourcesにアクセスするのが難しい
・Resourcesのファイルには、書き込みできない(正確な情報ではない)
・公式からResourcesは使わない方がいいと発表されている

いろいろと情報があったのですが、Resources内のファイルに
データを上書きするのは、難しいと感じました。

ただ、最後のResourcesを使うなってのが気になります。
どういう事なんでしょう?


さっそくGoogle先生に、
”Unity Resourcesは使わない方がいい”でお尋ねしてみますヽ(´~`;)センセイ
いろいろと情報が記事にされています。

この辺りの情報を見ていると
・Resourcesのリソースは、Unity内部のリソースを使っている
・起動時にResourcsの内容は、一度全て読み込まれてキャッシュされる
・Resourcesが大きと起動時間が延びる
・Resourcesの内容を変更した場合、以前のリソースに上乗せされてリソースを取られる

ざっくりとした解釈ですが、こんな感じの事が書かれていました。

なるほど…
Resourcesは、あるだけでリソースを取る仕組みになっているわけですね。
ようは、Resourcesにスプライトやテキストを置いて使わなくても
それだけでバックボーンとして読み込まれているって事ですな。

当然、Resourcesにファイルが多いと読込む時間が延びる訳で(-_-;)

しかもUnity内部のリソースを使っているので、解放が難しい上に、
PLAY中にResources内部を変えると、更に上乗せでリソースを取る仕様になっているんですね。

たしかに、大物アプリなどではリソース管理が大変になってきそうです。

では、Resourcesは使うなって事なんでしょうか?

使っても大きく影響しにくい物があるそうです。
・開発中のもの
・Resources内にアップデートが及ばないもの
・AndroidやiOSなどの単体で動くもの

なんだそうです。
少し安心しました。
大物の開発なんて無縁なので…

では、Resourcesを使わずにデータの読込みをさせるには、
どうすればいいか?となってきますが、

AddressableAssetSystemなる物が公開されています。

以前は、AssetBundleが主流だったそうですが、2020年に
公式からAddressableAssetSystemが公開されたようです。

これから読込みの主流になりそうなので、
少し勉強をしてみたいと思います。

まず、プロジェクトを立ち上げてAddressableAssetSystemを
使えるようにセッティングします。
Unityのバージョンは、2020.2.3f1です。

AddressableAssetSystemは、PackageManagerからインストールできるので、
Addressable①.jpg
タブの、ウィンドウ→パッケージマネージャーを開きます。

Addressableが表示されてない場合は、
Addressable②.jpg
Unityレジストリに切り替えてみて下さい。

Addressable③.jpg
Addressablesを選択してインストールします。

インストールができたら準備をしていきます。
CSVファイルを用意して、読み込ませるのですが
Textを一つ用意して、読込み表示だけもさみしいので、
TextAssetを取り込む二つの方法も同時に載せておきます。

TextAssetの取り込みについてご存じの方はスルーして頂けると幸いでっす。
Addressable④.jpg
表示用のテキストを三つ用意します。

上から
・TextAssetをpublicな変数で取得したものを表示
・Resources.Loadを使って取得したものを表示
・Addressableで取得したものを表示

となります。

つづいて、CSVファイルを用意します。
ファイルの内容はUTF-8で作成すると読込めるようになります。


Resourcesフォルダ内
Addressable⑥.jpg
ファイル名は、AssetTestとLoadTestの二つを用意しました。

Addressableは、Resourcesを使わない事とあったので、
別にフォルダを作成して、CSVとしておきます。
Addressable⑦.jpg
ファイル名は、AddressableTestです。

つづいて、AddressableTestファイルのAddressable登録をします。
Addressable⑧.jpg
AddressableTestをクリックして、インスペクターを見てもらうと
スクショの項目が出来ているので、Addressableにチェックを入れます。
チェックを入れると、横にパスが表示されます。

これでAddressableTestファイルが登録されました。

続いて、登録された情報を確認します。
Addressable⑨.jpg
スクショの手順でグループを開きます。

DefaultLocalGroupを開くと
Addressable⑩.jpg
こんな感じで登録情報がセットされているかと思います。

CSVファイルのインスペクターにAddressableのチェック項目がない場合、
Addressable⑰.jpg
Addressableのグループに直接アタッチで登録する事もできます。


Addressableは、登録された情報をグループで管理して
呼び出すようにできているようです。

呼び出す際は、登録名または、ラベルを指定するといいみたいです。
今回は、登録名から呼び出してみたいと思います。

まず、登録名が長いので短くしてみようと思います。
Addressable⑪.jpg
登録名の上で右クリックして、SimpleyAddressableNameを選択します。

ファイル名だけになったかと思います。
スクリプトから呼び出す際、登録名を指定する必要があるのですが、
stringで指定する必要があるので、パスまで名前に入っていると
長いのと間違い易いって事もあるので、シンプルネームに変換しておくと
楽になります。

ここからスクリプトになるのですが、
テキストの読込みを調べたのですが、なかなか見つかりませんでした。

唯一見つけられたのが、

Section31さん
【Unity】Addressable Asset System の楽チンな使い方を解説【Ver0.3.5対応版】

貴重な情報ありがとうございますm(_ _)m

ここで使わているCSVの読込みを流用させて頂きます。
TestLoad

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.AddressableAssets;

public class TextLoad : MonoBehaviour
{
[Header("各表示テキスト")]
public Text textAssetTx;
public Text resourcesLoadTx;
public Text addressableTx;



[Header("AssetTestファイル")]
public TextAsset assetTestCSV; //AssetTest取り込み

//ファイル名リスト
private string loadTestCSV = "LoadTest"; //Resources.Load用ファイル名
private string addressTestCSV = "AddressableTest"; //Addressable用ファイル名



// Start is called before the first frame update
void Start()
{
StartCoroutine(AddressableLoad());
ResourcesFileLoad();
}

//Resources内のデータを読み込む
private void ResourcesFileLoad()
{
//パブリックで取得したアセット
textAssetTx.text = assetTestCSV.text;

//Resources.Loadで取得したアセット
TextAsset reTxAst = Resources.Load(loadTestCSV) as TextAsset;
resourcesLoadTx.text = reTxAst.text;
}

//Addressableを使って読み込む
IEnumerator AddressableLoad()
{
TextAsset dataFile = new TextAsset(); //テキストファイルの保持
dataFile = null;
//Assetのロード
Addressables.LoadAsset(addressTestCSV).Completed += op =>
{
//ロードに成功
dataFile = op.Result;
addressableTx.text = op.Result.text;
};
//DL完了待合わせ
do
{
/*ロード待ち。ロード不可の場合はずーと抜けない。
時間等で切るようにする必要がある。 */
yield return null;
} while (dataFile == null);
}
}


ごちゃごちゃとしてるので、少し説明します。

Resources内の二つのファイルは、従来通りの取得方法で行っています。
AssetTestファイルを読み込むのは、変数なのでassetTestCSVを用意して、
Unity上でアタッチしています。

Resources.Loadで読み込むLoadTestファイルは、ファイル名が必要なので、
loadTestCSVとして、stringでファイル名を設定しておいて、
Resources.Loadに代入してやります。


Addressableは、Resources.Loadと同じようにファイル名で読み込むので、
addressTestCSV として、stringで設定しておきます。

注意点として、Addressableのグループで登録された名前である事です。
もし、シンプル化してない場合は、パスを含める名前を指定する必要があります。

Addressableを使う場合は、using UnityEngine.AddressableAssets;を宣言しておきます。

Section31さんが触れておられますが、データの読込みが行われない場合などは、
無限ループするので、注意が必要ですよ~!

最後にアタッチします。
Addressable⑱.jpg
準備が整ったので、PLAYします。
Addressable⑯.jpg
無事データを読み込んで表示ができました。ヽ(´▽`)/~♪

と、ここまではUnity上の話です。

実は、大きな問題点が…

AndroidにビルドするとAddressableが機能しませんでした。
いろいろと調べてみましたが、どうもAssetBundleと併用する必要がありそうです。
正直、知識が足りないので、理解するまで至りませんでした。(T-T) グスッ

また、スクリプト内にも問題が…
Addressables.LoadAssetのコマンドは、古いコマンドと警告が出てきます。
新しいコマンドが分からないので、修正する事もできません(T-T) グスッ

現段階でAndroidには、Resourcesを活用するのが一番楽な方法といえます。

しかし、Addressableが進化していけば、Resourcesを必要としなくなるかもしれません。
今の内から慣れておいた方が良いようにも思います。

引き続き、情報収集と使い方を勉強して行こうと思うので、
何か分かれば、新しく記事にしたいと思います。

ま、それまでは、Resourcesでいいか~
面倒な事は先送りにして…
(;^o^) \(ToT )あんたほんとにそれでいいの

今後、Resourcesには出来るだけ不要な物を入れないと思った次第でっす。

少しでも参考になれば幸いかと思います。
それでは、今回はこのへんで
(o・・o)/~マタネェ


この記事へのコメント