- 用户指南
- 资源商店 (Asset Store)
- 资源服务器 (Asset Server)(仅限团队许可证)
- 缓存服务器(仅限团队许可证)
- 幕后场景
- 创建游戏
- 运行时实例化预设 (Prefabs)
- 变换 (Transforms)
- 物理
- 添加随机的游戏元素
- 粒子系统(Particle Systems)
- Mecanim 动画系统
- 旧动画系统
- 导航网格 (Navmesh) 和寻路 (Pathfinding)(仅限专业版 (Pro))
- Sound (音频侦听器)
- 游戏界面元素
- 多玩家联网游戏
- iOS 开发入门
- Android 开发入门
- Blackberry 10 开发入门
- Metro:入门指南
- 本地客户端开发入门
- FAQ
- Advanced
- Vector Cookbook
- 资源包(仅限专业版)
- Graphics Features
- 资源数据库 (AssetDatabase)
- 构建播放器管道
- 分析器(仅限专业版)
- 光照贴图快速入门
- 遮挡剔除(仅限专业版)
- 相机使用技巧
- 运行时加载资源
- 通过脚本修改源资源
- 用程序生成网格几何体
- 富文本
- 在 Unity 工程 (Project) 中使用 Mono DLL
- 事件函数的执行顺序
- 移动优化实用指南
- Unity XCode 工程结构
- 优化图形性能
- 减少文件大小
- 理解自动内存管理
- 平台依赖编译
- 泛型函数
- 调试
- 插件(专业版/移动版特有功能)
- 文本场景文件格式(仅限专业版)
- 流媒体资源
- 启动时运行编辑器脚本代码
- 网络模拟
- VisualStudio C 集成
- 分析
- 检查更新
- 安装多版本 Unity
- 故障排除
- Unity 中的阴影
- Unity 中的 IME
- 对集成显卡进行优化
- 网络播放器 (Web Player) 部署
- 使用网络播放器中的信任链系统
Keeping track of loaded AssetBundles
跟踪已下载资源包
Unity 一次只允许加载一个特定资源包 (AssetBundle) 实例到应用程序中。这意味着您无法检索 WWW 对象中之前已加载的相同资源包 (AssetBundle) 或尚未加载的资源包。实际上,这意味着您尝试访问之前已下载的如下资源包 (AssetBundle) 时:
AssetBundle bundle = www.assetBundle;
程序将引出以下错误
Cannot load cached AssetBundle.A file of the same name is already loaded from another AssetBundle
且资源包属性将返回 null。如果第一次下载时下载了该资源包 (AssetBundle),则第二次下载时无法检索到该资源包,因此,无需再使用该资源包时,可以将其卸载 或获取其引用,并在它存在于内存中时避免将其下载。可根据需求决定需要采取的相应措施,但我们建议在加载完对象后立即卸载该资源包 (AssetBundle)。这可释放内存空间,并且不会再收到有关加载已缓存资源包 (AssetBundles) 的错误。
如需跟踪已下载资源包 (AssetBundles),可使用包装类协助管理下载,如下:
using UnityEngine; using System; using System.Collections; using System.Collections.Generic; static public class AssetBundleManager { // A dictionary to hold the AssetBundle references static private Dictionary<string, AssetBundleRef> dictAssetBundleRefs; static AssetBundleManager (){ dictAssetBundleRefs = new Dictionary<string, AssetBundleRef>(); } // Class with the AssetBundle reference, url and version private class AssetBundleRef { public AssetBundle assetBundle = null; public int version; public string url; public AssetBundleRef(string strUrlIn, int intVersionIn) { url = strUrlIn; version = intVersionIn; } }; // Get an AssetBundle public static AssetBundle getAssetBundle (string url, int version){ string keyName = url + version.ToString(); AssetBundleRef abRef; if (dictAssetBundleRefs.TryGetValue(keyName, out abRef)) return abRef.assetBundle; else return null; } // Download an AssetBundle public static IEnumerator downloadAssetBundle (string url, int version){ string keyName = url + version.ToString(); if (dictAssetBundleRefs.ContainsKey(keyName)) yield return null; else { using(WWW www = WWW.LoadFromCacheOrDownload (url, version)){ yield return www; if (www.error != null) throw new Exception("WWW download:"+ www.error); AssetBundleRef abRef = new AssetBundleRef (url, version); abRef.assetBundle = www.assetBundle; dictAssetBundleRefs.Add (keyName, abRef); } } } // Unload an AssetBundle public static void Unload (string url, int version, bool allObjects){ string keyName = url + version.ToString(); AssetBundleRef abRef; if (dictAssetBundleRefs.TryGetValue(keyName, out abRef)){ abRef.assetBundle.Unload (allObjects); abRef.assetBundle = null; dictAssetBundleRefs.Remove(keyName); } } }
An example usage of the class would be:
using UnityEditor; class ManagedAssetBundleExample :MonoBehaviour { public string url; public int version; AssetBundle bundle; void OnGUI (){ if (GUILayout.Label ("Download bundle"){ bundle = AssetBundleManager.getAssetBundle (url, version); if(!bundle) StartCoroutine (DownloadAB()); } } IEnumerator DownloadAB (){ yield return StartCoroutine(AssetBundleManager.downloadAssetBundle (url, version)); bundle = AssetBundleManager.getAssetBundle (url, version); } void OnDisable (){ AssetBundleManager.Unload (url, version); } }
请记住,本示例中的 AssetBundleManager 类是静态的,正在引用的任何资源包 (AssetBundles) 不会在加载新场景时销毁。请将此类当做指南例程,但正如最初建议的那样,最好在使用后立即卸载资源包 (AssetBundles)。您始终可以克隆之前实例化的对象,无需再下载该资源包 (AssetBundles)。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论