CRIWARE Unity Plugin Manual  Last Updated: 2024-04-24
ファイル読み込み方式とクラス
CRI File Systemライブラリ(ファイルマジックPROランタイムライブラリ)におけるファイル読み込み方式には、「コルーチン方式」「従来方式」の2つがあります。
用途や目的によりファイル読み込み方式を使い分けることができます。

コルーチン方式(CriFsUtility クラス)

コルーチンによりバックグラウンドで非同期にファイル読み込み処理を行います。
ファイル読み込みの終了待ちは yield命令 で行います。
ファイル読み込みやバインドなどの処理を簡単に行えるように、ユーティリティクラス CriWare.CriFsUtility を用意しています。
このクラスは、 CRI File Systemの基本オブジェクトである、バインダ( CriWare.CriFsBinder )やローダ( CriWare.CriFsLoader )を自動的に生成、処理を行います。
そのため、シンプルでわかりやすいコードを記述することができます。

処理の流れ

  • (1) コルーチンの生成・開始
    アプリケーションで用意したファイル読み込みの関数をコルーチンとして開始します。

    StartCoroutine(this.AppLoadFunction(path));

  • (2) ファイル読み込みリクエストの発行
    CriWare.CriFsUtility.LoadFile 関数をコールすると、ファイル読み込みのリクエストが発行され、バックグラウンドで非同期に読み込み処理が行われます。
    リクエストオブジェクトが戻り値として返ります。

    CriFsLoadFileRequest request = CriFsUtility.LoadFile(path);

  • (3) ファイル読み込みの終了待ち
    yield 命令により、ファイル読み込みの終了待ちを行います。
    error が null であれば、ファイル読み込みは成功です。

    yield return request.WaitForDone(this);
    if (request.error == null) { // ファイル読み込みが成功
    // リクエストオブジェクトからバッファ取得、データ処理
    ...
    }

  • (4) リクエストオブジェクトからバッファ取得、データ処理
    例えば、テキストファイルの場合、読み込んだテキストデータ request.bytes を指定したエンコーディングで文字列に変換します。

    Encoding enc = Encoding.GetEncoding("utf-8");
    this.loadedText = enc.GetString(request.bytes);



従来方式(CriFsLoader クラス)

フレーム更新時にポーリングにより読み込み完了を確認する、コンシューマゲーム機向けファイルマジックPROでのファイル読み込み方法です。
CriWare.CriFsLoader クラスを使って、従来方式でのファイル読み込みを行います。

ファイル処理を行う際は、 バインダとファイル名によりファイルを指定します。
「バインダ」 CriWare.CriFsBinder )は、仮想的なドライブあるいはデバイスのようなものです。
バインダには、ファイルやディレクトリ、CPKファイルを登録(バインド)することができます。
ファイルの読み込みは、このバインダを経由して、「ローダ」CriWare.CriFsLoader )により行います。

処理の流れ

  • (1) バインダの作成
    まず、事前にバインダを作成しておきます。
    単体ファイルを読み込む場合には、バインダに読み込み元を割り当てる必要はありません。

    CriFsBinder binder = new CriFsBinder();

    バインダにディレクトリ、CPKファイルを割り当てる場合は、それぞれ、 CriWare.CriFsUtility.BindDirectory 関数、 CriFsUtility.BindCpk 関数を使います。

  • (2) ファイルサイズの取得
    対象ファイルのファイルサイズを取得します。

    int file_size = (int)binder.GetFileSize(path);

  • (3) ファイル読み込みバッファの確保
    ファイルサイズ分のバッファを確保します。

    byte[] buffer = new byte[file_size];

  • (4) ローダの作成
    ファイルを読み込むためにローダ( CriWare.CriFsLoader )を作成します。
    一つのローダを使い回して複数のファイルを読むこともできます。
    また、ファイルごとにローダを用意し、複数のファイルの読み込みを同時に処理することもできます。

    CriFsLoader loader = new CriFsLoader();

  • (5) ファイル読み込みリクエストの発行
    CriWare.CriFsLoader.Load 関数 をコールすると、ファイル読み込みのリクエストが発行されます。
    単体ファイルの読み込みなので、第1引数のバインダはnullにしておきます。

    loader.Load(null, path, 0, file_size, buffer);

  • (6) ファイル読み込みの完了確認
    ファイル読み込みの完了を確認するには、毎フレームごとに、ローダ状態を CriWare.CriFsLoader.GetStatus 関数により取得します。
    ファイル読み込みが完了すると、ローダの状態は、 CriFsLoader.Status.Complete になります。

    // フレームごとに実行
    public void Update()
    {
    // 読み込み完了か?
    if (loader.GetStatus() == CriFsLoader.Status.Complete) {
    // 読み込んだデータの処理
    ...
    }
    }

    ローダの状態は次のように遷移します。

    fmpu_fs_state_transition.png
    ローダの状態遷移図

  • (7) 読み込んだデータの処理
    以下のコードは、バッファ buffer に読み込まれたテキストデータを処理する例です。

    Encoding enc = Encoding.GetEncoding("utf-8");
    this.loadedText = enc.GetString(buffer);
    loader.Stop();

[備考]
実際のコードについては、サンプル「 [CriFs]ファイルの読み込み 」をご覧ください。