第一章 了解Unity目录与加载方式

1. Resources,StreamingAssets 和 PersistentDataPath

在序言中已经提到说 Resources 可以用来存放资源并提出一些缺陷,但Resources依然还是需要用到的,主要是用来存放一些不需要热更的特殊文件,通常是一些配置文件,或者可能是游戏的logo以及启动画面之类的,这些资源很小,而且也不需要更新,所以可以放到 Resources 文件夹下。在打包的时候,Unity会把工程下所有 Resources 文件夹进行合并压缩在一起。

StreamingAssets 和 PersistentDataPath,这两个文件夹都是存放的原生资源,也就是文件夹下有什么,打包完成后里面就是什么,并不会对文件进行更改,但在PC平台与移动平台上,StreamingAssets 是有所区别的。在PC平台上如 Windows,StreamingAssets 可读可写,而在移动平台上如 Android,StreamingAssets 就只有可读权限了,并且不可以直接用C#的IO类进行加载,如 FileStream 类,也没有办法使用C#的 File.Exists 判断资源是否存在,想要读取 StreamingAssets 下的资源,可以用 UnityWebRequest 的方式去异步加载资源,如果资源是 AssetBundle,也可以用 AssetBundle.LoadFromFile 来加载。BundleMaster 将 LocalBundlePath 默认设置为 StreamingAssets,用来存放首包资源,而之后更新的内容,会将更新部分存放在 PersistentDataPath 目录下。(Tips. 什么是首包资源? 一些项目资源内容并不大,希望将资源放在包体内也就是 StreamingAssets 下,这份资源就是首包资源。)

PersistentDataPath 目录在移动平台下没有限制,既可读也可写,并且可以正常使用C#的IO类。BundleMaster 将更新目录也就是 HotfixPath 默认设置为 PersistentDataPath ,但要注意的是 PersistentDataPath 目录在 Windows 下 在C盘,因此使用BundleMaster的时候推荐在开发阶段编辑器下的时候,将更新目录也就是 HotfixPath 重新映射为其它地方。

打包的时候非 Resources 和 StreamingAssets 下的资源都会被丢弃掉,我们正好可以利用这一特性,创建一个其它文件夹用于存放我们的资源,而最后会将资源构建成 AssetBundle,我们只需要 AssetBundle 在包体里即可,资源正好可以在打包的时候丢弃掉,不会在包里占用额外的空间。

2. 加载资源的方式

对于加载使用到的API这里不再赘述,可以查阅Unity的官方文档。Resources 只可以 加载Resources 文件夹下的资源,可以不填资源后缀。BundleMaster 使用的是 LoadFromMemory 通过 byte[] 加载 AssetBundle ,比较灵活。AssetDatabase.LoadAssetAtPath 是只有在编辑器下才可以使用的加载API,它可以加载所有路径下的资源,并且不管Unity是否是运行时都可以加载,但它只能同步加载没有办法进行异步。

在 BundleMaster 中提供了三种运行模式。分别是:

  1. Develop
  2. Local
  3. Build

其中 Develop 模式下所有加载API都是调用的 AssetDatabase.LoadAssetAtPath ,这样在开发阶段中不需要构建 AssetBundle 包,非常方便,但与之相对的所有异步加载接口在 Develop 下都是同步执行的。Local 模式则是跳过检查更新的流程,直接使用 LocalBundlePath 下的资源。Build 模式则是正常检查更新,并且将更新的部分放在 HotfixPath下,会优先加载HotfixPath下的资源。

91焦先生

2022/07/18