CRIWARE Unity Plugin Manual  Last Updated: 2024-04-24
[Asset Support] DeployType の拡張

サンプル内容

概要


独自の DeployType を追加・利用するサンプルです。 画面内のボタンを押すことでキューの再生/停止が可能です。

シーン情報


ミドルウェア CRI ADX (CRI Atom)
サンプル Asset Support サンプル
格納場所 /cri/unity/samples/UnityProject/Assets/CriAssetSamples/Scenes/
シーンファイル Scene_07_CustomDeployType.unity
ACBアセット /cri/unity/samples/UnityProject/Assets/CriAssetSamples/Data/PinballMain.acb


プログラムの解説

ICriAssetImplCreator を実装したクラスを定義することでCRIアセットの Deploy Typeの設定 を追加しています。
本サンプルの DeployType ではデータをアセット内に持ち、ダウンロード後にキャッシュに書き出すことでファイルロード可能にします。
注意
本サンプルの DeployType を利用するとアセット内とキャッシュ内に2重にデータを持ってしまいます。
可能な限り CRI Addressables を利用するか、独自の DeployType によってNon-Asset CRIデータをダウンロードする実装をお勧めします。

ICriAssetImpl の実装

CRIアセットが実際どのようにデータを持つかは ICriAssetImpl インターフェイスによって抽象化されています。
ICriMemoryAssetImpl または ICriFileAssetImpl を継承したクラスをCRIアセットのインスタンスが持つことで、
アセット毎に異なる方法で実際のデータとの関係を表現できます。

本サンプルでは ICriFileAssetImpl を継承したクラスを定義しています。
// アセット内に情報を保持するために Serializable 属性が必要
[System.Serializable]
public class Scene_07_CustomDeployType : ICriFileAssetImpl
{
// アセット内にシリアライズしてデータを保持
[SerializeField, HideInInspector]
byte[] data;
[SerializeField]
string fileName;
public Scene_07_CustomDeployType(byte[] data, string fileName)
{
this.data = data;
this.fileName = fileName;
}
public string Path => System.IO.Path.Combine(CriWare.Common.installCachePath, fileName);
public ulong Offset => 0;
public long Size { get; }
public bool IsReady { get; private set; }
public void OnEnable() {
File.WriteAllBytes(Path, data);
IsReady = true;
#if !UNITY_EDITOR
data = null;
#endif
}
public void OnDisable() => File.Delete(Path);
}
この実装ではデータの実体をバイト配列としてアセット内に保持します。
アセットがインスタンス化された際に呼ばれる OnEnable メソッド内でデータをキャッシュフォルダに書き出すことで、
データをファイルとしてロードすることを可能にしています。
これによって、Addressables に依存することなくストリーミングデータを AssetBundle に含めることが可能ですが、
アセット内とキャッシュ内に2重にデータを持ってしまいます。

ICriAssetImplCreator の実装

CRIアセットをインポートする際にNon-Asset CRIデータの内容をアセットに紐付ける処理は ICriAssetImplCreator インターフェイスによって抽象化されています。
ICriAssetImplCreator を継承したクラス内の CreateAssetImpl メソッドでNon-Asset CRIデータに対する処理を行います。
CreateAssetImpl は ICriFileAssetImpl インターフェイスのインスタンスを戻り値とします。
本サンプルでは Scene_07_CustomDeployType クラスのインスタンスを返しています。
public ICriAssetImpl CreateAssetImpl(AssetImportContext ctx)
{
// 対象のファイルの内容を全て読み出し
var data = File.ReadAllBytes(ctx.assetPath);
// キャッシュ書き出し時のパスに利用するハッシュを生成
var md5 = MD5.Create();
var hash = md5.ComputeHash(data);
md5.Clear();
// 対象のデータを格納した Scene_07_CustomDeployType のインスタンスを生成して返す
return new Scene_07_CustomDeployType(data, BitConverter.ToString(hash).ToLower().Replace("-", ""));
}
ICriAssetImplCreator を継承したクラスは Editor スクリプトとして定義してください。
本サンプルでは UNITY_EDITOR マクロによってランタイムから除外しています。

また、CriDisplayName アトリビュートを利用してインポータ上での表示名を指定可能です。
[System.Serializable, CriDisplayName("CustomDeploySample")]