资源

为了保证玩家的体验,我们不推荐再使用同步的方式加载资源,由于 Game Framework 自身使用了一套完整的异步加载资源体系,因此只提供了异步加载资源的接口。不论简单的数据表、本地化字典,还是复杂的实体、场景、界面,我们都将使用异步加载。同时,Game Framework 提供了默认的内存管理策略(当然,你也可以定义自己的内存管理策略)。多数情况下,在使用 GameObject 的过程中,你甚至可以不需要自行进行 Instantiate 或者是 Destroy 操作。

常规用法

获取资源组件

获取资源只读区路径

默认情况下,等同于 UnityEngine.Application.streamingAssetsPath 返回的路径。

获取资源读写区路径

默认情况下,等同于 UnityEngine.Application.persistentDataPath 或者 UnityEngine.Application.temporaryCachePath 返回的路径,视 ResourceComponent 配置而定。

获取资源模式

Game Framework 中,资源模式分为三种:Package(单机模式)、Updatable(预下载的可更新模式)、UpdatableWhilePlaying(使用时下载的可更新模式)。

  • Package(单机模式):适用于单机游戏,游戏资源无需在 app 内进行更新时使用此模式。
  • Updatable(预下载的可更新模式):适用于中大型网络游戏,游戏资源需要在游戏主流程开始前更新完毕,以保证良好的游戏内体验。
  • UpdatableWhilePlaying(使用时下载的可更新模式):适用于小型网络游戏,游戏资源可以在游戏主流程进行的过程中进行更新。游戏运行过程中,遇到需要加载某个资源但该资源尚未下载时,会先去下载资源再进行加载,故此行为可能导致较差的游戏体验,不建议使用。

获取当前变体

变体特性在 Game Framework 中一般用于本地化语言的区分,即当某种资源需要做本地化语言区分时,使用变体功能实现,详见本地化文档

版本资源列表序列化器

Game Framework 使用版本资源列表记录了特定资源模式、特定目录下的全部资源信息。不同类型的版本资源列表使用对应的版本资源列表序列化器,按照版本资源列表的版本号进行序列化(将内存数据写入磁盘)和反序列化(将磁盘数据读取内存)操作。使用者也可以定义自己项目独特的版本资源列表格式,并注册到版本资源列表序列化器上进行使用。

当资源模式为单机模式时,仅需要使用下面一种版本列表序列化器:

当资源模式为可更新模式时,应使用下面四种版本列表序列化器:

获取当前资源适用的游戏版本号

标识资源适用的游戏版本号,仅用于对外展示使用,Game Framework 内部逻辑并不关心此版本号,但仍然建议与游戏版本号保持一致,推荐使用 MajorVersion.MinorVersion.PatchVersion 格式,如 1.0.0。

获取当前内部资源版本号

标识内部资源版本号,Game Framework 的资源更新等逻辑会使用此版本号作为资源变化的判定依据。可以每次构建资源时将此版本号自增 1,或者使用其它有意义的能够用于区分版本差异的值(如 SVN 的版本号等)。

获取资源数量

Game Framework 中有两个关于资源的定义,在使用过程中需要注意区分。Game Framework 设计的所有方法都是面向 Asset 的,Resource 隐藏在内部,不对外公开,以降低使用的复杂度。

  • Asset,用于描述 Unity 中的一个具体资产,如一个预制体、一个材质、一张图片等。
  • Resource,用于描述 Unity 中的一个 AssetBundle(一些 Asset 的集合),或者一个 Game Framework 定义下的二进制文件(一个 Asset 的二进制形式,能够用于脱离 Unity 直接加载)。

获取资源组数量

资源组用于将资源分类,是资源的一种特性标签,一个资源可以归属于多个资源组。通过资源组可以游戏中构造出类似于“插件”的更新机制,如高清材质包、游戏语音包等。

获取或设置资源更新下载地址前缀

获取或设置每更新多少字节的资源,重新生成一次版本资源列表

获取正在应用的资源包路径

获取等待应用资源数量

获取或设置资源更新重试次数

获取正在更新的资源组

获取等待更新资源数量

获取候选更新资源数量

获取正在更新资源数量

获取加载资源代理总数量

获取可用加载资源代理数量

获取工作中加载资源代理数量

获取等待加载资源任务数量

获取或设置资源对象池自动释放可释放对象的间隔秒数

获取或设置资源对象池的容量

获取或设置资源对象池对象过期秒数

获取或设置资源对象池的优先级

获取或设置资源对象池自动释放可释放对象的间隔秒数

获取或设置资源对象池的容量

获取或设置资源对象池对象过期秒数

获取或设置资源对象池的优先级

资源应用成功事件

资源应用失败事件

资源更新开始事件

资源更新改变事件

资源更新成功事件

资源更新失败事件

参考手册

最佳实践

(待完善)

常见问题

什么是资源的编辑器模式?什么是资源的发布时模拟模式?

资源的编辑器模式是为了开发时方便,避免反复构建 AssetBundle 而设计的一种仅在 Unity 编辑器内可用的模式。使用资源的编辑器模式时,所有资源将利用 UnityEditor.AssetDatabase 中提供的方法直接从磁盘进行加载。

如下图所示,当勾选图示选项时,即可打开资源的编辑器模式,若取消勾选该选项,即可使用资源的发布时模拟模式(即非编辑器模式)进行资源加载。此时需要预先构建并准备完成 AssetBundle。发布时模拟模式能够完整模拟发布时状态下的各种特性,如资源的异步加载等,方便调试一些发布时相关的问题。

再次强调,资源的编辑器模式仅可在编辑器内使用,即使保持勾选此选项,在发布时此选项也将失效。

资源 - 第1张  | Game Framework

为什么编辑器里能正常跑通的逻辑,到了发布时报找不到资源的错误?

主要有三种情况:

  1. 版本资源列表不存在(提示 HTTP/1.1 404 Not Found 错误)
    请确认所需的资源文件是否已经正确复制到 StreamingAssets 目录下。
  2. 要加载的资源不存在(提示 NotExist 错误)
    请检查是不是仅使用资源的编辑器模式跑通了逻辑,而忽视了对资源的发布时进行必要的处理流程(InitResources / CheckResources)。两种模式存在一定的差异,资源的编辑器模式下,是直接从磁盘加载资源,而无需初始化版本资源列表。
    请确认要加载的资源是否真的构建到 AssetBundle 中了,可使用 AssetBundleBuilder 生成的 BuildReport 进行检查。
  3. 要加载的资源尚未准备完毕(提示 NotReady 错误)
    请确认要加载的资源是否已经正确进行资源更新。