查看: 46224|回复: 200

[在unity中制作] 跟踪加载资源包

  [复制链接]

7

主题

7

帖子

176

积分

vip会员

Rank: 1

积分
176
发表于 2016-7-13 19:12:50 | 显示全部楼层 |阅读模式
统一只会让你有一个特定的资源包加载到应用程序的一个时间的一个实例。这意味着你不能如果同样一个已加载先前没有被卸载从WWW检索对象的资源包。在实践上,它意味着当你试图访问一个以前加载资源包这样:

AssetBundle bundle = www.assetBundle;
以下将出现错误

无法加载缓存的资源包。一个同名文件已经从另一个资源包加载
与相关属性将返回null。既然你不能取回资源包二下载过程中如果第一个还装,你需要做的是卸载当你不再使用它的资源,或保持对它的引用,避免下载它如果它已经在记忆。你可以根据你的需要正确的行动,但我们的建议是,你卸载AssetBundle只要你完成加载对象。这将释放内存,你将不再得到加载缓存的资源包错误。

请注意,在Unity 5束将完成加载之前任何的束将卸下。所以调用AssetBundle.Unload。卸载功能有些捆正在加载将阻止其它的代码的执行直到所有文件加载。这将添加一个性能问题。这已经重新统一5。

如果你想保持你的下载资源,你可以使用一个封装类来帮助你管理你的下载如下:

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 {
           while (!Caching.ready)
               yield return null;

           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);
       }
   }
}

类的一个实例将:

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类是静态的,和任何资源,你引用不会破坏加载新场景的时候。使用这个类作为指导,但建议最初最好是卸载他们一直在使用中对后。你总是可以克隆一个预先实例化的对象,除需要加载资源包了。

回复

使用道具 举报

0

主题

876

帖子

2886

积分

vip会员

Rank: 1

积分
2886
发表于 2016-7-13 19:32:28 | 显示全部楼层
这个不会又是超级贵吧.
回复 支持 反对

使用道具 举报

0

主题

873

帖子

2919

积分

vip会员

Rank: 1

积分
2919
发表于 2016-7-13 19:32:27 来自手机 | 显示全部楼层
助人为乐啊!
回复 支持 反对

使用道具 举报

0

主题

842

帖子

2777

积分

vip会员

Rank: 1

积分
2777
发表于 2016-7-13 19:47:04 | 显示全部楼层
谢谢楼主分享
回复 支持 反对

使用道具 举报

0

主题

867

帖子

2832

积分

vip会员

Rank: 1

积分
2832
发表于 2016-7-13 20:26:48 | 显示全部楼层
这个必须顶,撸主好人
回复 支持 反对

使用道具 举报

0

主题

862

帖子

2887

积分

vip会员

Rank: 1

积分
2887
发表于 2016-7-13 20:58:21 | 显示全部楼层
楼主能发图瞧瞧嘛
回复 支持 反对

使用道具 举报

0

主题

846

帖子

2774

积分

vip会员

Rank: 1

积分
2774
发表于 2016-7-13 21:48:11 来自手机 | 显示全部楼层
多少钱,看看
回复 支持 反对

使用道具 举报

0

主题

894

帖子

2940

积分

vip会员

Rank: 1

积分
2940
发表于 2016-7-13 22:09:26 来自手机 | 显示全部楼层
O(∩_∩)O哈哈~,谢谢分享哟
回复 支持 反对

使用道具 举报

0

主题

844

帖子

2763

积分

vip会员

Rank: 1

积分
2763
发表于 2016-7-13 22:27:27 来自手机 | 显示全部楼层
看看价格支持下
回复 支持 反对

使用道具 举报

0

主题

914

帖子

3055

积分

vip会员

Rank: 1

积分
3055
发表于 2016-7-13 23:01:38 来自手机 | 显示全部楼层
谢谢 分享 这个我还记得 不错
回复 支持 反对

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | enginedx注册

本版积分规则

 
 



邮件留言:


 
返回顶部