CRIWARE Unity Plugin Manual  Last Updated: 2024-04-24
[CriFs]ネイティブAPIラッパー

サンプル内容

概要

cri4u_samples_crifs_scene06_game_mini.png

CRI File Sysytem(ファイルマジックPROランタイムライブラリ)の 「ネイティブAPIをラッパーしたクラス」を利用したサンプルです。

操作方法

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

  • [Step2 : Load File]
    • [Load Image File]ボタン
      いずれかのCPKファイルよりイメージファイルを読み込みます。

    • [Load Text File]ボタン
      いずれかのCPKファイルよりText Bundleファイルを読み込みます。

    • [Stop Loading]ボタン
      読み込みを停止します。

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

シーン情報


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


プログラムの解説



[プログラムの概要]

本サンプルは、CRI File SysytemのネイティブAPIをラッパしたクラスを利用しています。
yield命令は使用せずにUpdate関数内で状態を監視しています。
パックファイル"sample.cpk"内の、イメージファイル"criware.png"、テキストファイル"sample_text.txt”をロードしています。
「バインダ」は、仮想的なドライブのようなもので、バインダに対してパックしたファイル(CPKファイル)をBindCpk関数によってバインドする(結びつける)とその内部のファイルをロードすることができます。

複数のパックファイルをバインドすることができますので、BindCpkの返り値はバインドIDと呼ばれる数値です。複数のファイルをバインドすることを「マルチバインド」といいます。
「バインダ+ファイル名」をローダーに指定することによって、ファイルをロー ドすることができます。

  1. バインダCriFsBinderに"sample.cpk"をバインド。 (BindCpk関数)
  2. バインド完了をUpdate関数内でによりチェック。 (GetStatus関数)
  3. バインダとファイル名("criware.png", "CharMw.unity3d")を指定して、ローダーに読み込み開始を実行。 (Load関数)
  4. Update関数内でローダーの読み込み完了をチェック。(GetStatus関数)
  5. ロード中にストップするときは、ローダーに対してStop関数を実行。

== Tips ==
  • 複数のファイルを読み込むときは、複数のローダーを使用して同時に読み 込みリクエストを行った方が高速に読み込む事ができます。
  • CPKファイルをバインドすることによって、高速にファイルサイズの取得ができます。パックしていないファイルのファイルサイズを取得すると処理がブロッキングされてしまいます。


[プログラム解説]

(1)バインダとローダーの作成
binder = new CriFsBinder();  /* バインダ */
loader1 = new CriFsLoader(); /* イメージ用 */
loader2 = new CriFsLoader(); /* テキストファイル用 */
アプリケーション起動時にバインダとローダーを作成します。
サンプルでは、コンストラクタで作成しています。
loaderを複数作成していますが、一つのloaderで複数のファイルを連続的に読み込むよりも、複数のローダーで同時に読み込みを実行したほうがバックグラウンドで連続的に読み込まれるため、パフォーマンスが良くなります。<br>
(2)バインダへのパックしたファイル(CPKファイル)の登録
bind_id = binder.BindCpk(null, path);
バインダに、CPKファイルを結びつけています。
BindCpk関数は、CPKファイルのディレクトリ情報の読み込みを開始します。
一つのバインダに対して複数のCPKファイルをバインドできますので、BindCpk関数はバインドIDというCPKファイルに対応する識別子を返します。
if ( CriFsBinder.GetStatus(bind_id) == CriFsBinder.Status.Complete ) {
  bind_stat = BindStatus.Complete;
}
バインドが正常に完了したかどうかをバインドIDを指定してGetStatus関数によってチェックします。

(3)ファイルのロード
int file_size = (int)binder.GetFileSize(path);
buffer1 = new byte[file_size];
loader1.Load(binder, path, 0, file_size, buffer1);
バインダからファイル名を指定して、ファイルサイズを取得します。CPKがバインドされていると、メモリ上に常駐しているディレクトリ情報からファイルサイズを即座に取得することができます。
バインダに対して何もバインドしてない場合、各OS上の生のファイルサイズやネットワーク上のファイルサイズを取得することができますが、GetFileSize関数がブロックされてします。CPKファイルを利用することによって、このブロックを回避することができます。
Load関数を実行するとファイルの読み込みを開始します。
ファイルは、「バインダとファイル名」によって指定します。第3引数はファイル内のオフセットであり、これを指定するとファイル内の任意の位置から読み込むことができます。
if ( loader1.GetStatus() == CriFsLoader.Status.Complete ) {
  this.texture = new Texture2D(0, 0);
  this.texture.LoadImage(buffer1);
  loader1.Stop();
}
読み込みが完了したかどうかを、GetStatus関数によってチェックします。
状態がCompleteに変化したら読み込みが完了します。
読み込みエラーが発生した場合は、Error状態に遷移します。
読み込みが完了するとbuffer1にデータが読み込まれています

(4)ファイルのロードの中断
this.loader1.Stop();
this.loader2.Stop();
Stop関数を実行すると、状態がStop状態に遷移します。
ロードを途中で中断することができますので、ユーザーの操作性を向上することができます。

(5)リソースの開放
this.loader1.Dispose();
this.loader2.Dispose();
this.binder.Dispose();
シーン終了時やローダーやバインダを破棄する場合は、Dispose関数を実行してください。
ネイティブ側で確保しているリソースを開放します。