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として認識される。
クラス的には下図のような構成。
CriAssetBase
各種アセットの基底抽象クラス。ScriptableObjectの派生クラス。
SerializeReference属性でICriAssetImplインタフェースを実装した型への参照を保持している。
このCriAssetBaseを継承してACB/ASB/ACFに対応した各クラスが実装されている。
ICriAssetImplを基底をしたインタフェースは以下の3つ
- ICriMemoryAssetImpl
- オンメモリに展開されたデータへの参照
- ICriFileAssetImpl
- ファイルとして保存されたデータへの参照
- ICriFsAssetImpl
- CPKファイル内のコンテンツへの参照
ACFファイルのインスペクタ
ACBファイルのインスペクタ
紐付いたAWBファイルやキュー情報が確認できるのが便利。
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で対応する。
CriDataグループ
アンカーアセットが生成されると、Addressablesに自動で追加されるグループ。
アンカーアセットが登録されており、CRI独自のResourceProviderによってリソース取得を行う。
CriResourceProvider
UnityWebRequest
とDonwloadHandlerFile
を用いてNon-Asset CRIデータをキャッシュへダウンロードする。
キャッシュ済みの場合、またはダウンロード完了時に対象のNon-Asset CRIデータのパスをファイル名をキーとしてCriAddressables
に登録する。
CriAddressableAssetImpl
CRI AssetsのICriFileAssetImpl
を実装したクラス。
ファイルパスとしてCriAddressablesからパスを取得して返す。
AddressablesでCRIの各種アセットを扱う仕組み
ビルド時
- CriDataグループに登録されたアンカーアセットがビルドされてアセットバンドルになる
- ビルド完了をフックして、アンカーアセットのアセットバンドルをNon-Asset CRIデータと置換する
下記がビルド完了のコールバックとして、置換を行うDeployメソッドを登録している箇所の実装
[InitializeOnLoadMethod]
static void RegisterHook()
{
BuildScript.buildCompleted += (AddressableAssetBuildResult result) => {
if (EditorApplication.isPlayingOrWillChangePlaymode) return;
Deploy();
};
}
ランタイム
- CRIアセットを参照したコンポーネントを含んだプレハブのロード要求をする
- CRIアセットはアンカーアセットを参照しているので、依存解決によってアンカーアセットのアセットバンドルを先にダウンロードしようとする
- ビルド時にアンカーアセットのアセットバンドルはNon-Asset CRIデータにすり替えられているので、それを
CriResourceProvider
がダウンロードして保存したパスを登録する - CRIアセットが内部的に保持しているファイル名をキーとして
CriAddressables
に問い合わせて再生などの処理を行う
その他気になったこと
- 登録するパスのキーがファイル名なので、フォルダが違うだけでファイル名が同一の場合に困る
- v0.3.13でBundleNameを併用するようになったので解決
- Addressablesのカタログにはアンカーアセットのアセットバンドルのサイズが記載されてしまう
- ランタイムに再計算する
CriWare.Assets.CriAddressables.ModifyLocators
メソッドが提供されている
- ランタイムに再計算する
- Addressablesの通信並列数の制御から外れている。外付け拡張なので仕方がない
- ビルド完了時の置換の都合上、Addressablesの
BundleNameingMode
をFilename
から変えられない - prefabなどのアセットから参照されていないアンカーアセットは置換が行われない
- ビルドするのはアンカーアセットなので、Non-Asset CRIデータを更新しても、Addressables的には更新扱いにならない
- アンカーアセットを再生成すれば解決する
- v0.5.04で一括再生成する機能が追加された