动态加载/卸载资源

4
我需要管理我的内存,所以想要在运行时动态加载/卸载所有的NGUI页面。为此,我创建了包含预制件(prefab)的AssetBundle,并将这些AssetBundles保留在我的apk中。
有什么方法可以在Android设备上进行加载/卸载呢?
我大致知道AssetBundle.CreateFromMemory,但无法实现它。
我是在正确的方向上思考,还是缺少了什么东西?
需要帮助/?
1个回答

2
我认为你走对了路。Unity支持在项目中使用资源文件夹,以允许在主游戏文件中提供内容,但在请求之前不加载。在Unity Pro、Unity iOS Pro(曾经称为“iOS Advanced”)和Unity Android Pro(曾经称为“Android Advanced”)中,您还可以创建资产包。这些是与主游戏文件完全分离的文件,其中包含要从文件或URL访问的资产。 Asset Bundle是外部资产的集合。您可以拥有许多Asset Bundle,因此拥有许多不同的外部资产集合。这些文件存在于构建的Unity播放器之外,通常位于Web服务器上,供最终用户动态访问。
要构建Asset Bundle,请从编辑器脚本内调用BuildPipeline.BuildAssetBundle()。在参数中,您指定要包含在构建文件中的对象数组,以及其他一些选项。这将构建一个文件,稍后您可以通过使用AssetBundle.Load()在运行时动态加载它。
您可以通过调用AssetBundle.Unload()来卸载AssetBundle的资源。如果将unloadAllLoadedObjects参数设置为true,则内部保存的对象以及使用AssetBundle.Load()从AssetBundle中加载的对象都将被销毁,并释放Bundle使用的内存。
有时候,您可能更喜欢加载AssetBundle,实例化所需的对象并释放Bundle使用的内存,同时保留这些对象。好处是,您可以为其他任务释放内存,例如加载另一个AssetBundle。在这种情况下,您应该将参数设置为false。当Bundle被销毁后,您将无法再从中加载对象。
如果您想在加载另一个级别之前销毁使用Resources.Load()加载的场景对象,请对它们调用Object.Destroy()。要释放资产,请使用Resources.UnloadUnusedAssets()
Unity文档中阅读整个故事。

感谢Joetjah的快速简洁回复。 顺便问一下,我能把AssetBundles放在我的apk里吗? 如果可以,我该如何加载它们? 我知道从Web服务器加载它们的方法,但是对于应用程序加载感到困惑。 - chetan rane
安装 APK 时,可以将各种 bundle 与其一起安装。这并不意味着这些 bundle 在每个场景中都会被加载。因此,它将为您节省 RAM,因为在不需要时这些 bundle 不会被访问。 - Joetjah
那么这意味着我必须将所有资源显式地加载到设备上,对吗? 但是如果应用程序上传到商店怎么办? 抱歉如果这些问题看起来很傻,但我是个新手,真的卡在这里了。 - chetan rane
我在这方面有一些经验,但并不是全部都知道。我只是根据我读到的内容做出了一些假设。我认为,你从商店下载的APK可能会很大。这意味着手机的ROM会被填满。但是,在启动应用程序时,只会加载您选择的资源。因此,设备的RAM不会被填满那么多。当然,前提是您知道何时加载/卸载正确的包,并确保您没有泄漏任何地方。 - Joetjah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接