/// <summary>
        /// 创建需要加载的LocalAssetResource,如果存在就获取,添加到下载链表中
        /// </summary>
        /// <param name="resource"></param>
        /// <param name="handler"></param>
        /// <param name="assetPRI"></param>
        /// <returns></returns>
        public LocalAssetResource CreateAssetResource(ResourceData resource, AssetLoadFinishedEventHandler handler, AssetPRI assetPRI)
        {
            if (resource == null)
            {
                return(null);
            }
            string             mPath         = resource.mPath;
            string             key           = Path.GetFileNameWithoutExtension(mPath).ToLower();//获取文件名,不包括扩展名
            LocalAssetResource assetResource = new LocalAssetResource(resource);

            if (!this.m_dicAssetResoure.ContainsKey(key))//如果不包含这个资源,就创建资源然后添加到资源集合中
            {
                assetResource         = new LocalAssetResource(resource);
                assetResource.PRIType = assetPRI;
                this.m_dicAssetResoure.Add(key, assetResource);
                if (this.m_allLoadFinishedEventHandler != null)
                {
                    this.m_total += assetResource.Size;
                }
                Debug.Log(assetResource.URL + "添加到下载链表!");
                this.m_linkedListNeedToLoad.AddLast(assetResource);//把需要加载的资源添加到链表的最后
            }
            else
            {
                assetResource = this.m_dicAssetResoure[key];
                Debug.Log("之前已经加载过了:" + assetResource.URL);
            }
            if (handler != null && !assetResource.Canceled)//设置加载完成之后的委托
            {
                assetResource.SetLoadFinishedHandler((AssetLoadFinishedEventHandler)Delegate.Combine(assetResource.GetLoadFinishedHandler(), handler));
            }
            return(assetResource);
        }
 /// <summary>
 /// 检测资源是否下载出错
 /// </summary>
 /// <returns></returns>
 private bool DetectAllHasFinished()
 {
     if (this.m_assetResource != null)
     {
         if (!this.m_assetResource.HasCallBack)//如果完成的话,就检测资源是否下载出错
         {
             return(false);
         }
         this.DeceteResourceError(this.m_assetResource);
     }
     if (this.m_depAssetResources != null)
     {
         for (int i = 0; i < this.m_depAssetResources.Length; i++)
         {
             LocalAssetResource resource = this.m_depAssetResources[i];
             if (resource != null)
             {
                 if (!resource.HasCallBack)
                 {
                     return(false);
                 }
                 this.DeceteResourceError(resource);
             }
         }
     }
     return(true);
 }
        /// <summary>
        /// 添加引用资源,赋值depAssetResource[]
        /// </summary>
        /// <param name="depSO">需要添加的资源</param>
        /// <param name="index">添加到哪个位置</param>
        public void AddDep(IAssetResource depSO, int index)
        {
            LocalAssetResource assetResource = depSO as LocalAssetResource;

            if (assetResource != null && this.m_depAssetResources != null && index < this.m_depAssetResources.Length && index >= 0 && !this.HasAssetResource(assetResource))
            {
                this.m_depAssetResources[index] = assetResource;
                assetResource.AddRef();
            }
        }
 /// <summary>
 /// 设置当前资源,初始化assetResource
 /// </summary>
 /// <param name="assetSO"></param>
 public void SetAsset(IAssetResource assetSO)
 {
     if (this.m_assetResource != null)
     {
         AssetLogger.Error(string.Format("null != m_assetResource:{0}", this.GetAssetResourceStates()));
         return;
     }
     if (assetSO != null)
     {
         this.m_assetResource = assetSO as LocalAssetResource;
         this.m_assetResource.AddRef();
     }
 }
 public void Clear()
 {
     while (this.assetResourceQueue.Count > 0)
     {
         LocalAssetResource resource = this.assetResourceQueue.Dequeue();
         resource.Dispose();
     }
     this.assetResourceQueue.Clear();
     foreach (LocalAssetResource current in this.m_dicAssetResoure.Values)
     {
         current.Dispose();
     }
     this.m_dicAssetResoure.Clear();
     this.m_dicAssetCollectDepResource.Clear();
 }
 /// <summary>
 /// 卸载Assetbundle内存镜像引用
 /// </summary>
 private void UnloadAssetBundle()
 {
     if (this.m_depAssetResources != null)
     {
         for (int i = 0; i < this.m_depAssetResources.Length; i++)
         {
             LocalAssetResource resource = this.m_depAssetResources[i];
             if (resource != null)
             {
                 resource.UnloadAsset();
             }
         }
     }
     if (this.m_assetResource != null)
     {
         this.m_assetResource.UnloadAsset();
     }
 }
 /// <summary>
 /// 加载带有引用资源的资源(包括自身和引用资源)的主资源
 /// </summary>
 private void LoadMainAsset()
 {
     if (this.m_depAssetResources != null)
     {
         for (int i = 0; i < this.m_depAssetResources.Length; i++)
         {
             LocalAssetResource resource = this.m_depAssetResources[i];
             if (resource != null)
             {
                 resource.LoadMainAsset();//加载引用资源的主资源
             }
         }
     }
     if (this.m_assetResource != null)
     {
         this.m_assetResource.LoadMainAsset();//加载当前资源的主资源
     }
 }
 /// <summary>
 /// 查看引用资源数组里面是否已经包含该资源
 /// </summary>
 /// <param name="resource"></param>
 /// <returns></returns>
 public bool HasAssetResource(LocalAssetResource resource)
 {
     if (this.m_assetResource == resource)
     {
         return(true);
     }
     if (this.m_depAssetResources != null)
     {
         for (int i = 0; i < this.m_depAssetResources.Length; i++)
         {
             LocalAssetResource depResource = this.m_depAssetResources[i];
             if (depResource == resource)
             {
                 return(true);
             }
         }
     }
     return(false);
 }
        public string GetAssetResourceStates()
        {
            StringBuilder stringBuilder = new StringBuilder(128);

            if (this.m_assetResource != null)
            {
                stringBuilder.AppendFormat("{0}:{1}.{2}", this.m_assetResource.URL, this.m_assetResource.IsDone, this.m_assetResource.Error);
            }
            if (this.m_depAssetResources != null)
            {
                for (int i = 0; i < this.m_depAssetResources.Length; i++)
                {
                    LocalAssetResource assetResource = this.m_depAssetResources[i];
                    if (assetResource != null)
                    {
                        stringBuilder.AppendFormat("{0}:{1}.{2}", assetResource.URL, assetResource.IsDone, assetResource.Error);
                    }
                }
            }
            return(stringBuilder.ToString());
        }
 private void Clear()
 {
     if (this.m_assetResource != null)
     {
         this.m_assetResource.DelRef();
         this.m_assetResource = null;
     }
     if (this.m_depAssetResources != null)
     {
         for (int i = 0; i < this.m_depAssetResources.Length; i++)
         {
             LocalAssetResource assetResource = this.m_depAssetResources[i];
             if (assetResource != null)
             {
                 Debug.Log("dep :" + assetResource.URL + "delref:" + assetResource.RefCount);
                 assetResource.DelRef();
             }
         }
         this.m_depAssetResources = null;
     }
 }
 /// <summary>
 /// 检测哪些资源在加载是出错,就添加到listAssetResource集合里面去
 /// </summary>
 /// <param name="resource"></param>
 private void DeceteResourceError(LocalAssetResource resource)
 {
     if (resource != null)
     {
         if (string.IsNullOrEmpty(resource.Error))         //如果资源下载没出错的话
         {
             if (this.m_listErrorAsset.Contains(resource)) //如果存在的话,表示第一次下载出错,第二次正确,就移除
             {
                 this.m_listErrorAsset.Remove(resource);
                 return;
             }
         }
         else
         {
             if (!this.m_listErrorAsset.Contains(resource))
             {
                 this.m_listErrorAsset.Add(resource);
             }
         }
     }
 }
        public IAssetRequest CreateAssetRequest(ResourceData resourceData, List <ResourceData> depResourceList, AssetRequestFinishedEventHandler callback, AssetPRI assetPRI)
        {
            if (resourceData == null)
            {
                return(null);
            }
            AssetLogger.Debug("CreateAssetRequest:" + resourceData.mResourceName);
            if (string.IsNullOrEmpty(resourceData.mPath))
            {
                return(null);
            }
            LocalAssetCollectDepResource depResource = null;

            if (this.m_dicAssetCollectDepResource.TryGetValue(resourceData.mPath, out depResource))
            {
                return(new LocalAssetRequest(depResource, callback));
            }
            depResource     = LocalAssetCollectDepResource.Create();
            depResource.URL = resourceData.mPath;
            this.m_dicAssetCollectDepResource.Add(depResource.URL, depResource);
            if (depResourceList != null)
            {
                depResource.SetDepSize(depResourceList.Count);//初始化depAssetResource[],引用资源的数组
                for (int i = 0; i < depResourceList.Count; i++)
                {
                    ResourceData resourceData2 = depResourceList[i];
                    Debug.Log(resourceData2.mResourceName);
                    LocalAssetResource assetResource = this.CreateAssetResource(resourceData2, new AssetLoadFinishedEventHandler(depResource.AssetComplete), assetPRI);
                    depResource.AddDep(assetResource, i);//赋值depAssetResource[]
                    Debug.Log(assetResource == null);
                }
            }
            LocalAssetResource asset = this.CreateAssetResource(resourceData, new AssetLoadFinishedEventHandler(depResource.AssetComplete), assetPRI);

            depResource.SetAsset(asset);
            depResource.EndCreate();
            return(new LocalAssetRequest(depResource, callback));
        }
        /// <summary>
        /// 释放没用的资源
        /// </summary>
        /// <returns></returns>
        private bool UnLoadNotUsedResource()
        {
            bool          result = false;
            List <string> list   = new List <string>();

            foreach (var current in this.m_dicAssetResoure)
            {
                //如果资源被引用的次数为0,就加入到需要被卸载的列表内
                if (0 >= current.Value.RefCount)
                {
                    Debug.Log("UnloadADd:" + current.Key);
                    list.Add(current.Key);
                }
            }
            //遍历所有需要卸载的列表,释放资源
            for (int i = 0; i < list.Count; i++)
            {
                string             key           = list[i];
                LocalAssetResource assetResource = null;
                if (this.m_dicAssetResoure.TryGetValue(key, out assetResource))
                {
                    if (assetResource != null)
                    {
                        Debug.Log("dispose" + assetResource.URL);
                        assetResource.Dispose();
                        result = true;
                    }
                    this.m_dicAssetResoure.Remove(key);
                }
            }
            bool          flag  = false;
            List <string> list2 = new List <string>();

            foreach (var current2 in this.m_dicAssetCollectDepResource)
            {
                if (0 >= current2.Value.RefCount)
                {
                    if (!flag)
                    {
                        list2.Add(current2.Key);
                        flag = true;
                    }
                    else
                    {
                        if (current2.Value.GetRemoveQuickly())
                        {
                            list2.Add(current2.Key);
                        }
                    }
                }
            }
            for (int j = 0; j < list2.Count; j++)
            {
                string key2 = list2[j];
                LocalAssetCollectDepResource assetCollectDepResource = null;
                if (this.m_dicAssetCollectDepResource.TryGetValue(key2, out assetCollectDepResource))
                {
                    if (assetCollectDepResource != null)
                    {
                        Debug.Log("Unload:" + assetCollectDepResource.URL);
                        assetCollectDepResource.Dispose();
                        result = true;
                    }
                    this.m_dicAssetCollectDepResource.Remove(key2);
                }
            }
            return(result);
        }
        public void OnUpdate()
        {
            if (!this.UnLoadNotUsedResource() && this.m_allUnLoadFinishedEventHandler != null)
            {
                GC.Collect();
                Resources.UnloadUnusedAssets();
                Action <bool> allUnLoadFinishedEventHandler = this.m_allUnLoadFinishedEventHandler;
                this.m_allUnLoadFinishedEventHandler = null;
                allUnLoadFinishedEventHandler(true);
            }
            LinkedListNode <LocalAssetResource> next;

            for (LinkedListNode <LocalAssetResource> linkedListNode = this.m_linkedListAssetResourceInLoading.First; linkedListNode != null; linkedListNode = next)
            {
                next = linkedListNode.Next;
                LocalAssetResource value = linkedListNode.Value;
                if (value.IsDone)//已经加载完成
                {
                    Debug.Log(value.URL + "已经下载过了");
                    if (!string.IsNullOrEmpty(value.Error))//如果加载没错的话
                    {
                        this.m_bLoadError = true;
                        AssetLogger.Error(value.Error);
                    }
                    if (this.m_allLoadFinishedEventHandler != null)
                    {
                        this.m_current += value.Size;
                    }
                    this.m_linkedListAssetResourceInLoading.Remove(linkedListNode);
                    value.OnLoaded();
                }
                else //还没有加载
                {
                    if (value.Canceled)//如果已经取消就从链表中移除
                    {
                        Debug.Log("取消下载:" + value.URL);
                        this.m_linkedListAssetResourceInLoading.Remove(linkedListNode);
                    }
                    else
                    {
                        if (!value.Started)
                        {
                            Debug.Log(value.URL + "开始下载");
                            value.BeginDownload();
                        }
                    }
                }
            }
            //如果平台是手机的话,就处理1个,不是的话处理5个
            int dealCount = Application.isMobilePlatform ? 1 : 10;

            if (this.m_linkedListNeedToLoad.Count > 0 && this.m_linkedListAssetResourceInLoading.Count < dealCount)//保持一次处理5个asset
            {
                Debug.Log(this.m_linkedListNeedToLoad.Count);
                LocalAssetResource value2 = this.m_linkedListNeedToLoad.First.Value;
                this.m_linkedListNeedToLoad.RemoveFirst();
                Debug.Log("AddLast:" + value2.URL);
                this.m_linkedListAssetResourceInLoading.AddLast(value2);
            }
            //如果没有加载任务了,就表示完成执行完成回调函数
            if (this.m_linkedListNeedToLoad.Count == 0 && this.m_linkedListAssetResourceInLoading.Count == 0 && this.m_allLoadFinishedEventHandler != null)
            {
                Action <bool> allLoadFinishedEventHandler = this.m_allLoadFinishedEventHandler;
                this.m_allLoadFinishedEventHandler = null;
                try
                {
                    allLoadFinishedEventHandler(!this.m_bLoadError);
                }
                catch (Exception e)
                {
                    AssetLogger.Fatal(e.ToString());
                }
                this.m_total   = 0;
                this.m_current = 0;
            }
        }