# 对 Unity 动态加载资源的调研

1. 三种方式 #

(1) 通过 Resources 模块, 调用它的 load 函数 :
可以直接 load 并返回某个类型的 Object, 前提是要把这个资源放在 Resources 命名的文件夹下, Unity 不管有没有场景引用, 都会将其全部打包至安装包中. Resources.Load();

(2) 通过 bundle 的形式 :
将资源打成 asset bundle 放在服务器或本地磁盘, 然后使用 WWW 模块 get 下来, 然后从这个 bundle 中 load 某个 object. AssetBundle

(3) 通过 AssetDatabase.loadasset :
这种方式只在 Editor 范围内有效, 游戏运行时没有这个函数, 通常是在开发中调用使用的. AssetDatabase 资源数据库

2. 各方式的对比 #

(1) Resources 的方式需要把所有资源全部打包到安装包中, 对游戏的分包发布(微端)和版本升级(patch)是不利的, Unity 推荐的方式是不用它, 都用 bundle 的方式替代;

(2) Bundle 的方式把资源打成几个小的 bundle, 用哪个就 load 哪个, 这样还能分包发布和 patch, 但是在开发过程中, 有时候不可能更新一个资源就打一次 bundle;

(3) 既然在开发的过程中不可能每更新一个资源就打一次 bundle, 所以在 Editor 的环境下就可以使用 AssetDatabase 来模拟, 通常需要我们封装一个 dynamic resource 的 loader 模块, 在不同的环境下做不同实现.

3. 动态资源的存放 #

有时候需要存放一些自己的文件在磁盘上, 例如想把几个 bundle 放在初始的安装里, Unity 有一个 Streaming Asset 的概念, 用于提供存储接口的访问. 需要在编辑器建立一个 StreamingAssets 名字的文件夹, 把需要放在客户磁盘上的动态文件放在这个文件夹下, 这样, 安装之后这些文件就会在用户磁盘的指定位置, 这个位置可以通过 Application.streamingAssetsPath 来得到.

Not End.