サンプル内容
概要
独自の 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 を継承したクラスを定義しています。
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 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();
return new Scene_07_CustomDeployType(data, BitConverter.ToString(hash).ToLower().Replace("-", ""));
}
- ICriAssetImplCreator を継承したクラスは Editor スクリプトとして定義してください。
本サンプルでは UNITY_EDITOR マクロによってランタイムから除外しています。
- また、CriDisplayName アトリビュートを利用してインポータ上での表示名を指定可能です。
[
System.Serializable, CriDisplayName(
"CustomDeploySample")]