运行时加载资源

有些情况下,资源不必加载到场景就可以用到工程当中很有作用。例如,可能有个角色或其他对象出现在游戏的任何场景中但又极少用到(也许是一个“秘密”功能,一条错误消息或高分提醒)。此外,还可能想从单独的文件或 URL 加载资源,以缩短初始下载时间或允许互换游戏内容。

Unity 支持工程中的资源文件夹 (Resource Folders),允许在主游戏文件中提交内容,但在要求之前不会加载。在 Unity 专业版、Unity iOS 高级版和 Unity 安卓高级版中,也可以创建资源包 (Asset Bundles)。这些文件与主游戏文件完全分离开来,包含游戏需要从文件或 URL 中访问的资源。

资源包 (Asset Bundles)(仅限 Unity 专业版/iOS 高级版/安卓高级版许可证)

资源包 (Asset Bundles) 是一个外部资源集合。可以有许多资源包 (Asset Bundles),所以也有许多不同的外部资源集合。这些文件位于建成的 Unity 播放器外,通常在一个网路服务器上供终端用户动态访问。

要建一个资源包 (Asset Bundles),可从编辑器脚本中调用 BuildPipeline.BuildAssetBundle()。在参数中指定一个对象 (Objects) 数组,与其他选项一起附在建成的文件内。该步骤会生成一个文件,供以后在运行时通过 AssetBundle.Load() 动态加载。

资源文件夹 (Resource Folders)

资源文件夹 (Resource Folders) 为附在建成的 Unity 播放器内的资源集合,不一定要链接到检视器 (Inspector) 中的任一游戏对象。

如果要在资源文件夹 (Resource Folders) 中放入任何内容,只需在工程视图 (Project View) 中新建一个文件夹并命名为“资源 (Resources)”。工程 (Project) 中可以有多个排列不同的资源文件夹 (Resource Folders)。若想要从这些文件夹中加载资源,可随时调用 Resources.Load()

如果组建目标为流媒体网络播放器 (Streaming Web Player),可规定一个场景包含资源文件夹 (Resource Folders) 中的所有内容。该步骤可在播放器设置 (Player Settings) 中完成,访问地址为编辑 (Edit)->工程设置 (Project Settings)->播放器 (Player)。流队列由构建设置 (Build Settings) 中的场景顺序确定。

注意:

资源文件夹 (Resource Folders) 中的所有资源及其依赖关系都保存在 resources.assets 文件中。如果某资源已被另一个关卡使用,将保存在该关卡的 .sharedAssets 文件中。 编辑 (Edit)-> 播放器设置 (PlayerSettings) 第一个流媒体关卡 (First Streamed Level) 设置确定 resources.assets 将被收集并附在版本中的具体关卡。

如果"第一个流媒体关卡 (First Streamed Level)" 之前的关卡包含资源文件夹 (Resource Folders) 中的资源,该资源将保存在这个关卡的资源中。如果是之后的关卡包含资源,该关卡将从 “resources.assets” 文件中引用资源。

只有资源文件夹 (Resource Folders) 中的资源可通过 Resources.Load 访问。但是,更多资源因为存在依赖关系,可能最后到了 “resources.assets” 文件。(例如,资源文件夹 (Resource Folders) 中的材质 (Material) 可能引用该文件夹之外的纹理 (Texture))。

资源卸载

可通过调用 AssetBundle.Unload() 卸载 AssetBundle 的资源。如果将 true 传递给 unloadAllLoadedObjects 参数,AssetBundle 内部持有的对象和使用 AssetBundle.Load() 从 AssetBundle 中加载的对象都将销毁,资源包占用的内存被释放。

有时您可能想加载 AssetBundle,实例化所需对象并释放资源包占用的内存,又保留对象。这样做的好处是可以释放内存执行其他任务,如加载另一个 AssetBundle。在这种情况下,可将 false 传递为参数。资源包销毁后,不可以再从中加载对象。

如果想销毁已加载的场景对象,请在加载另一关卡前使用 Resources.Load(),对其调用 Object.Destroy()。要释放资源,可使用 Resources.UnloadUnusedAssets()

Page last updated: 2013-07-01