Exemple #1
0
    // 通过ResourceHolder.Resource获取资源
    public ResourceHolder <T> PrepareResource <T>(string bundlePath,
                                                  string assetName,
                                                  bool clearBundle,
                                                  bool cacheResource,
                                                  bool firstPriority,
                                                  bool fromCache,
                                                  bool forceFromUnityCache) where T : Object
    {
        var resourceHolder = new ResourceHolder <T>();

        if (mQueue.Count == 0 || firstPriority || fromCache)
        {
            Object res = null;
            if (ResourceManager.Instance.TryGetResourceFromCache(bundlePath, out res))
            {
                resourceHolder.LoadCompleteCallback(res as T);
                return(resourceHolder);
            }
        }

        Action func = () =>
        {
            Object res = null;
            if (ResourceManager.Instance.TryGetResourceFromCache(bundlePath, out res))
            {
                resourceHolder.LoadCompleteCallback(res as T);
                return;
            }
            //mQueueLockerTimes = true;
            ResourceManager.Instance.StartCoroutine(Instance.GetResourceWithHolder(bundlePath, assetName, resourceHolder,
                                                                                   clearBundle, cacheResource, forceFromUnityCache));
        };

        if (firstPriority)
        {
            mQueue.AddFirst(func);
        }
        else
        {
            mQueue.AddLast(func);
        }

        return(resourceHolder);
    }
Exemple #2
0
    private IEnumerator GetResourceWithHolder <T>(string bundlePath,
                                                  string assetName,
                                                  ResourceHolder <T> resourceHolder,
                                                  bool clearBundle,
                                                  bool cacheResource,
                                                  bool forceFromUnityCache) where T : Object
    {
        T   resource = default(T);
        var size     = 0;

        if (ResourceManager.Instance.UseAssetBundle)
        {
            string path;
            string bundlefullname;
            var    needDown = GetBundleRealPath(bundlePath, out path, out bundlefullname);
            WWW    www;
            if (forceFromUnityCache && !needDown)
            {
                www = WWW.LoadFromCacheOrDownload(path, UpdateHelper.Version);
            }
            else
            {
                www = clearBundle ? new WWW(path) : WWW.LoadFromCacheOrDownload(path, UpdateHelper.Version);
            }

            yield return(www);

            if (www.error != null)
            {
                Logger.Error("{0}, {1}", www.error, bundlePath);
                resourceHolder.LoadCompleteCallback(null);
                www.Dispose();
                //   mQueueLockerTimes = false;
                yield break;
            }

            if (clearBundle)
            {
                BundleDebugLog(eLoadType.AsyncLoad, path, 0);
            }

            size = 1;

            Object res = null;
            if (ResourceManager.Instance.TryGetResourceFromCache(bundlePath, out res))
            {
                resource = res as T;
            }
            else
            {
//                 var request = www.assetBundle.LoadAsync(Path.GetFileNameWithoutExtension(assetName), typeof(T));
//                 yield return request;
//                 resource = request.asset as T;


                if (mQueueLockerTimes < 0)
                {
                    yield return(new WaitForEndOfFrame());
                }

                LoadStopWatch.Reset();
                LoadStopWatch.Start();
                resource           = www.assetBundle.Load(Path.GetFileNameWithoutExtension(assetName), typeof(T)) as T;
                mQueueLockerTimes -= LoadStopWatch.ElapsedMilliseconds;
            }

#if UNITY_EDITOR
            var obj = resource as GameObject;
            if (obj)
            {
                ResourceManager.ChangeShader(obj.transform);
            }
#endif

            //缓存到硬盘
            if (needDown)
            {
                while (Interlocked.CompareExchange(ref WritingBundle, 1, 1) == 1)
                {
                    yield return(new WaitForEndOfFrame());
                }
                SaveBundleToDisk(www, bundlefullname);
            }


            //清理
            if (clearBundle || forceFromUnityCache)
            {
                www.assetBundle.Unload(false);
            }
            else
            {
                ResourceManager.Instance.mCommonBundle.Add(www.assetBundle);
            }
            www.Dispose();
        }
        else
        {
            resource = LoadResourceFromAsset <T>(bundlePath, assetName);
            yield return(new WaitForEndOfFrame());
        }

        if (cacheResource)
        {
            ResourceManager.Instance.AddResourcesToCache(bundlePath, resource, size);
        }

        //mQueueLockerTimes = false;
        resourceHolder.LoadCompleteCallback(resource);
    }