- 用户指南
- 资源商店 (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) 部署
- 使用网络播放器中的信任链系统
下载资源包 (Downloading AssetBundles)
下载资源包
此部分的前提是您已了解资源包构建方法。如不了解上述内容,请参阅构建资源包 (Building AssetBundles)
有两种方法可供下载资源包 (AssetBundle)
- 不缓存: 通过新建 WWW 对象完成。资源包 (AssetBundles) 不会缓存至本地存储设备的 Unity 缓存 (Cache) 文件夹。
- 缓存: 通过调用 WWW.LoadFromCacheOrDownload 完成。资源包 (AssetBundles) 会缓存至本地存储设备的 Unity 缓存 (Cache) 文件夹。网页播放器 (WebPlayer) 共享的缓存允许的最大资源包 ( AssetBundles) 缓存空间为 50 MB。PC/Mac Standalone 应用程序和 iOS/安卓 (Android) 应用程序的最大可用空间为 4 GB。使用专用缓存的网页播放器 (WebPlayer) 应用程序受到缓存许可协议指定的字节数量限制。请参阅脚本文档了解其他平台。
以下是一个非缓存下载示例:
using System; using UnityEngine; using System.Collections; class NonCachingLoadExample :MonoBehaviour { public string BundleURL; public string AssetName; IEnumerator Start() { // Download the file from the URL.It will not be saved in the Cache using (WWW www = new WWW(BundleURL)) { yield return www; if (www.error != null) throw new Exception("WWW download had an error:"+ www.error); AssetBundle bundle = www.assetBundle; if (AssetName == "") Instantiate(bundle.mainAsset); else Instantiate(bundle.Load(AssetName)); // Unload the AssetBundles compressed contents to conserve memory bundle.Unload(false); } } }
建议使用 WWW.LoadFromCacheOrDownload 下载资源包 (AssetBundles)。例如:
using System; using UnityEngine; using System.Collections; public class CachingLoadExample :MonoBehaviour { public string BundleURL; public string AssetName; public int version; void Start() { StartCoroutine (DownloadAndCache()); } IEnumerator DownloadAndCache (){ // Wait for the Caching system to be ready while (!Caching.ready) yield return null; // Load the AssetBundle file from Cache if it exists with the same version or download and store it in the cache using(WWW www = WWW.LoadFromCacheOrDownload (BundleURL, version)){ yield return www; if (www.error != null) throw new Exception("WWW download had an error:"+ www.error); AssetBundle bundle = www.assetBundle; if (AssetName == "") Instantiate(bundle.mainAsset); else Instantiate(bundle.Load(AssetName)); // Unload the AssetBundles compressed contents to conserve memory bundle.Unload(false); } } }
访问 .assetBundle
属性时,程序将提取下载的数据并创建资源包 (AssetBundle) 对象。此时,可加载资源包中的对象。传递到 LoadFromCacheOrDownload 的第二个参数指定要下载的资源包 (AssetBundle) 版本。如果缓存中没有该资源包 (AssetBundle),或拥有的版本低于所需版本,LoadFromCacheOrDownload 将下载资源包 (AssetBundle)。否则,将从缓存加载资源包 (AssetBundle)。
集中资源
准备好组件后,就可构建场景,以便加载资源包 (AssetBundle) 并在屏幕上显示其内容。
最终工程结构
首先,转至 游戏对象 (GameObject)-> 创建空游戏对象 (CreateEmpty) 来创建空的游戏对象。将 CachingLoadExample 脚本拖放至刚创建的空游戏对象。然后在 BundleURL 字段输入资源包 ( AssetBundle) 的 URL。我们已将其放入工程目录,因此您可复制文件目录位置并添加前缀 file://
,例如 file://C:/UnityProjects/AssetBundlesGuide/Assets/AssetBundles/Cube.unity3d
现在可在编辑器 (Editor) 中单击播放,然后应看见从资源包 (AssetBundle) 加载的立方体 (Cube) 预设。
在编辑器 (Editor) 中加载资源包 (AssetBundles)
使用需要构建并加载资源包 (AssetBundles) 的编辑器 (Editor) 可延缓开发进程。例如,如果修改了资源包 (AssetBundle) 中的资源 (Asset),则需稍后重新构建该资源包,并且在生产环境中,很可能会一起构建所有资源包 (AssetBundles),使得单个资源包的更新过程冗繁漫长。一个更有效的方法是,在编辑器 (Editor) 中设置一个独立的代码路径,可直接加载该资源 (Asset),而无需从资源包 (AssetBundle) 加载。为此,需要使用 Resources.LoadAssetAtPath(仅限编辑器)。
// C# Example // Loading an Asset from disk instead of loading from an AssetBundle // when running in the Editor using System.Collections; using UnityEngine; class LoadAssetFromAssetBundle :MonoBehaviour { public Object Obj; public IEnumerator DownloadAssetBundle<T>(string asset, string url, int version) where T :Object { Obj = null; #if UNITY_EDITOR Obj = Resources.LoadAssetAtPath("Assets/" + asset, typeof(T)); yield return null; #else // Wait for the Caching system to be ready while (!Caching.ready) yield return null; // Start the download using(WWW www = WWW.LoadFromCacheOrDownload (url, version)){ yield return www; if (www.error != null) throw new Exception("WWW download:"+ www.error); AssetBundle assetBundle = www.assetBundle; Obj = assetBundle.Load(asset, typeof(T)); // Unload the AssetBundles compressed contents to conserve memory bundle.Unload(false); } #endif } }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论