CRIWARE Unity Plugin Manual  Last Updated: 2024-12-05
[CriFs]マルチバインド

サンプル内容

概要

cri4u_samples_crifs_scene04_game_mini.png
本サンプルでは、1つのバインダに対して複数のCPKファイルをバインドします。これをマルチバインドといいます。
通常のバインドとマルチバインドの違い
通常、バインダを介してファイルロードする場合、ファイルはバインド中のCPK内で検索されます。 マルチバインドの時は、複数のCPK全体から検索されます。
マルチバインドの活用例
例えば「古いCPKを丸ごと更新するのではなく、古いCPKの差分だけを含めた新CPKをマルチバインドすることでコストを減らす」という活用例が考えられます。
実際、本サンプルでは2つのCPKファイルを使用します。 ここでは、片方をもう片方のアップデートパック(差分ファイル)と見立てています。 ベースCPKファイルには、2つのキャラクタ画像ファイルがパッキングされています。 差分CPKファイルには、キャラクタ画像ファイルが一つだけパッキングされています。こちらの画像ファイルは「更新のあった画像ファイル」という想定です。
常にアップデートパックからロードするには
ファイルのロード時には、アップデートパック(差分ファイル)側のCPKを優先して参照する必要があるため、 それぞれのCPKバインドIDに対し、CriFsBinder.SetPriority()による優先度設定を行っています。
本サンプルのように、ローカルCPKにアプリで必要な全てのファイルを含めておき、 各ファイルの更新分をアップデート側CPKにパッキングして後からマルチバインドする事で、 アプリケーションのロード部では元々あったファイル、 更新されたファイルを特に意識せずに同じコードでロードすることができます。
アップデートパック側CPKファイルには、更新された「sample_image2.png」のみ含まれています。 従って、他のファイルにアクセスした場合は、ローカルCPKからファイルを読み込みます。

サンプルの操作方法

  • [Step1 : Multi Bind CPK File]
    • [Bind Base CPK File]ボタン
      ローカルにあるベースCPKファイルをバインドします。

    • [Bind Update CPK File]ボタン
      ローカルにある差分CPKファイルをバインドします。

    • [Unbind CPK File]ボタン
      バインドを取り消します。

  • [Step2 : Load File]
    • [Load Image File 1]ボタン
      マルチバインドされたCPKファイルより、イメージファイル(1)を読み込みます。

    • [Load Image File 2]ボタン
      マルチバインドされたCPKファイルより、イメージファイル(2)を読み込みます。

  • [Reset]ボタン
    初期状態に戻します。

シーン情報


ミドルウェア ファイルマジックPRO (CRI File System)
サンプル Basicサンプル
格納場所 /cri/unity/samples/UnityProject/Assets/Scenes/crifilesystem/basic
シーンファイル Scene_04_MultiBind.unity


プログラムの解説

this.binder = new CriFsBinder();

はじめにアプリ側でバインダを作成します。
このバインダを対象に単体ファイルやCPKファイル等をバインドしていきます。

/* Request a CPK binding. */
/* Assign the content of the CPK to the specified binder handle. */
var request = CriFsUtility.BindCpk(this.binder, null, path);

CPKファイルのバインドリクエストを出します。バックグラウンドで非同期にバインド処理が行われます。
バインド対象となるバインダを指定して実行します。pathはCPKファイルのパスです。

/* バインド完了待ち */
yield return request.WaitForDone(this);
if (request.error == null) {

CPKファイルのバインド処理完了を待ちます。
errorがnullならバインド成功です。

/* If successful, store the binder ID on the application side. */
/* It is used for the release processing etc. */
this.bindId[bind_index] = request.bindId;
/* Assign the search priority.
CriFsBinder.SetPriority(this.bindId[bind_index], bind_index);

バインドが成功したら、requestのメンバであるバインドIDの値をアプリケーション側で覚えておく必要があります。
このバインドIDを指定して、ファイルアクセス時の検索優先度をCriFsBinder.SetPriority()で設定します。
このようなバインド処理を同一のバインダに対して複数行うことで、マルチバインドを実現します。

/* Issue a request for the file loading to the CPK-bound binder. */
var request = CriFsUtility.LoadFile(this.binder, path);
/* Wait for the completion of loading. */
yield return request.WaitForDone(this);

ロード時に、マルチバインド済みのバインダを指定します。
バインダにバインドされているCPKファイルのうち、優先度の高いものから順に検索され、ファイルがロードされます。