CRIWARE Unity Plugin Manual  Last Updated: 2024-07-12
文件加载的方法和种类
CRI文件系统库 (FileMajik PRO 运行时库)中含有两种可用的文件加载方法。分别为 "coroutine method(协同程序方法)""regular method(标准方法)"
根据不同的内容,你可以使用两者之一的方法。

协同程序方法 ( CriFsUtility 类)

该方法使用了协同程序,让文件在后台异步载入。
Yield语句用于等待文件加载的完成。
应用程序提供了 CriWare.CriFsUtility 应用类来帮助文件加载和绑定。
它能自动创建并处理CRI文件系统中的基础对象,即绑定器 (CriWare.CriFsBinder) 和加载器 (CriWare.CriFsLoader) 。
因此,你可以编写简单易懂的代码。

过程流程

  • (1) 创建并启动协同程序
    应用程序所提供的文件加载功能将以协同程序的形式启动。

    StartCoroutine(this.AppLoadFunction(path));

  • (2) 发出文件加载请求
    当呼叫 CriWare.CriFsUtility.LoadFile 功能时,程序将发出文件加载请求,文件将在后台异步载入。
    请求对象由该功能返回。

    CriFsLoadFileRequest request = CriFsUtility.LoadFile(path);

  • (3) 等待文件加载完成
    Yield语句用于等待文件加载的完成。
    如果错误为零,那么文件便已成功载入。

    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 类)

这是一个在FileMajik PRO中用于游戏机的文件载入方法。它在帧被更新的时候使用轮询,使其确认加载是否已经完成。
在这个方法中, CriWare.CriFsLoader 种类用于加载文件。

它需要一个绑定文件以及该绑定文件的路径。
"绑定器" (CriWare.CriFsBinder) 和虚拟驱动或设备相似。
你可以使用绑定器(绑定)来注册文件,目录和CPK文件。
文件通过绑定器,使用"加载器" (CriWare.CriFsLoader) 对象进行加载。

过程流程

  • (1) 创建绑定器
    首先,创建一个绑定器。
    请注意,如需加载一个单独的文件,你不需要将其分配至绑定器。

    CriFsBinder binder = new CriFsBinder();

    请分别使用 CriWare.CriFsUtility.BindDirectory 和 CriFsUtility.BindCpk 将目录和CPK文件分配至绑定器。

  • (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 功能。一个文件加载请求已发出。
    请将第一个参数(binder)设置为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) 处理载入文件
    以下是一些处理在缓冲区载入的文件的范例代码。

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

[注意]
如需实际代码,请参照 " [CriFs] 加载文件 " 范例。