LoginSignup
4
4

More than 1 year has passed since last update.

Addressables × CRIの調査メモ

Posted at

Asset Support Add-on

参考: CRIWARE Unity Plugin Manual - Asset Support Add-on

CRIWARE関連ファイルをUnityアセット形式で取り扱うことを可能にする公式アドオンプラグイン。

  • CRI Assets
    • データのUnityアセット化とそれに伴う各種開発補助
  • CRI Addressables
    • Addressable Asset Systemでのデータロードへの対応

CRIWARE関連ファイルはUnityではDefaultAsset扱いで、ファイルパスを指定する形で取り扱っていた。
これをUnityアセットとして認識させ、Addressablesでも扱えるようにするアドオン。

CRI Assets

調査時点では v0.3.10
現在の最新版は v0.4.01

Scripted Importerを活用して、CRIWARE関連ファイルをUnityアセットとして認識させる。

項目 CRIWARE標準 CRI Assets
データの扱い Non-Asset CRIデータ (ツール出力ファイル) Unityアセット
参照方法 ファイルパス GUID参照
Editor拡張による開発サポート コンポーネント/Editor Window アセット単位で拡張
データの配置場所 StreamingAssetsまたはキャッシュフォルダ プロジェクト内の任意のフォルダ
ストリーミング再生(単体ファイルから) 可能 可能
ストリーミング再生(AssetBundleから) 非対応 可能(CRI Addressables併用時のみ)

※ 表はCRIWARE Unity Plugin Manual - CRI Assetsから引用

実装的にはScripted ImporterによってCRIWARE関連ファイルはScriptableObjectとして認識される。
クラス的には下図のような構成。

cri_assets.png

CriAssetBase

各種アセットの基底抽象クラス。ScriptableObjectの派生クラス。
SerializeReference属性でICriAssetImplインタフェースを実装した型への参照を保持している。
このCriAssetBaseを継承してACB/ASB/ACFに対応した各クラスが実装されている。

ICriAssetImplを基底をしたインタフェースは以下の3つ

  • ICriMemoryAssetImpl
    • オンメモリに展開されたデータへの参照
  • ICriFileAssetImpl
    • ファイルとして保存されたデータへの参照
  • ICriFsAssetImpl
    • CPKファイル内のコンテンツへの参照

ACFファイルのインスペクタ

acf.png

ACBファイルのインスペクタ

紐付いたAWBファイルやキュー情報が確認できるのが便利。

acb.png

Deploy Type

各ファイルのインスペクタで設定するパラメータ。アセットの実データをどこに配置するかを表す。
詳細は公式マニュアル参照。

  • StreamingAssets
  • OnMemory
  • Addressables (Local)
  • Addressables (Remote)

※ CRI Addressablesのv0.4.09からAddressablesのLocalとRemoteは統合された。

CRI Addressables

調査時点では v3.3.07
現在の最新版は v0.5.04

CRI Assetsによりインポートした各種CRIアセットをAddressablesに対応させる。

アンカーアセット

CRIアセット(ScriptableObject)からNon-Asset CRIデータへの依存関係を表現する便宜上のアセット。
Deploy TypeをAddressablesにすると自動で生成される。CRIアセットとアンカーアセットは1:1で対応する。

 2023-02-15 16.50.51.png

CriDataグループ

アンカーアセットが生成されると、Addressablesに自動で追加されるグループ。
アンカーアセットが登録されており、CRI独自のResourceProviderによってリソース取得を行う。

crigroup.png

CriResourceProvider

UnityWebRequestDonwloadHandlerFileを用いてNon-Asset CRIデータをキャッシュへダウンロードする。
キャッシュ済みの場合、またはダウンロード完了時に対象のNon-Asset CRIデータのパスをファイル名をキーとしてCriAddressablesに登録する。

CriAddressableAssetImpl

CRI AssetsのICriFileAssetImplを実装したクラス。
ファイルパスとしてCriAddressablesからパスを取得して返す。

AddressablesでCRIの各種アセットを扱う仕組み

ビルド時

  1. CriDataグループに登録されたアンカーアセットがビルドされてアセットバンドルになる
  2. ビルド完了をフックして、アンカーアセットのアセットバンドルをNon-Asset CRIデータと置換する

 2023-02-15 17.12.04.png

下記がビルド完了のコールバックとして、置換を行うDeployメソッドを登録している箇所の実装

CriAddressableAssetsDeployer
[InitializeOnLoadMethod]
static void RegisterHook()
{
	BuildScript.buildCompleted += (AddressableAssetBuildResult result) => {
		if (EditorApplication.isPlayingOrWillChangePlaymode) return;
		Deploy();
	};
}

ランタイム

  1. CRIアセットを参照したコンポーネントを含んだプレハブのロード要求をする
  2. CRIアセットはアンカーアセットを参照しているので、依存解決によってアンカーアセットのアセットバンドルを先にダウンロードしようとする
  3. ビルド時にアンカーアセットのアセットバンドルはNon-Asset CRIデータにすり替えられているので、それをCriResourceProviderがダウンロードして保存したパスを登録する
  4. CRIアセットが内部的に保持しているファイル名をキーとしてCriAddressablesに問い合わせて再生などの処理を行う

その他気になったこと

  • 登録するパスのキーがファイル名なので、フォルダが違うだけでファイル名が同一の場合に困る
    • v0.3.13でBundleNameを併用するようになったので解決
  • Addressablesのカタログにはアンカーアセットのアセットバンドルのサイズが記載されてしまう
    • ランタイムに再計算するCriWare.Assets.CriAddressables.ModifyLocatorsメソッドが提供されている
  • Addressablesの通信並列数の制御から外れている。外付け拡張なので仕方がない
  • ビルド完了時の置換の都合上、AddressablesのBundleNameingModeFilenameから変えられない
  • prefabなどのアセットから参照されていないアンカーアセットは置換が行われない
  • ビルドするのはアンカーアセットなので、Non-Asset CRIデータを更新しても、Addressables的には更新扱いにならない
    • アンカーアセットを再生成すれば解決する
    • v0.5.04で一括再生成する機能が追加された
4
4
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
4
4