IEnumerator CoLoadBundleAsync <T>(string assetName, string bundleName, E_LoadAsset eloadAsset, System.Action <T> callback)
            where T : IAssetGetter, new()
        {
            AssetBundle              bundle       = null;
            BundleHolder             bundleHolder = null;
            AssetBundleCreateRequest bundleRequest;
            // 没有加载过bundle
            string bundlePath;

            if (!bundleHolders.TryGetValue(bundleName, out bundleHolder))
            {
                bundlePath = GetBundlePath(bundleName);
                //bundleRequest = AssetBundle.LoadFromFileAsync(Path.Combine(bundleRootPath, bundleName));
                bundleRequest = AssetBundle.LoadFromFileAsync(bundlePath);
                while (!bundleRequest.isDone)
                {
                    yield return(bundleRequest);
                }

                //存bundleHolder
                bundle       = bundleRequest.assetBundle;
                bundleHolder = new BundleHolder(bundle);
                bundleHolder.AddRefence(assetName);
                //Debug.LogError(Time.realtimeSinceStartup + " " + bundleName + " " + assetName);
                bundleHolders.Add(bundleName, bundleHolder);
            }
            else
            {
                bundleHolder.AddRefence(assetName);
                bundle = bundleHolder.Get();
            }

            // 加载依赖的bundle
            string[] dependencies = manifest.GetAllDependencies(bundleName);
            for (int i = 0, iMax = dependencies.Length; i < iMax; ++i)
            {
                BundleHolder dependBundleHolder = null;
                if (bundleHolders.TryGetValue(dependencies[i], out dependBundleHolder))
                {
                    //已经存在的bundle只增加引用
                    dependBundleHolder.AddRefence(assetName);
                    continue;
                }
                //没加载过的
                AssetBundle dependBundle = null;
                bundlePath    = GetBundlePath(dependencies[i]);
                bundleRequest = AssetBundle.LoadFromFileAsync(bundlePath);
                while (!bundleRequest.isDone)
                {
                    yield return(bundleRequest);
                }
                dependBundle       = bundleRequest.assetBundle;
                dependBundleHolder = new BundleHolder(dependBundle);
                dependBundleHolder.AddRefence(assetName);
                //存bundleHolder
                bundleHolders.Add(dependencies[i], dependBundleHolder);
            }

            yield return(CoLoadAssetAsync <T>(bundle, assetName, eloadAsset, callback));
        }
        IEnumerator CoLoadAssetAsync <T>(AssetBundle assetBundle, string assetName, E_LoadAsset eloadAsset, System.Action <T> callback)
            where T : IAssetGetter, new()
        {
            AssetBundleRequest assetRequest = null;

            switch (eloadAsset)
            {
            case E_LoadAsset.LoadSingle:
                int    index             = assetName.LastIndexOf("/");
                string assetNameInBundle = assetName.Substring(index + 1);
                assetRequest = assetBundle.LoadAssetAsync(assetNameInBundle);
                break;

            case E_LoadAsset.LoadAll:
                assetRequest = assetBundle.LoadAllAssetsAsync <Object>();
                break;
            }

            while (!assetRequest.isDone)
            {
                yield return(assetRequest);
            }

            AssetHolder assetHolder = null;

            switch (eloadAsset)
            {
            case E_LoadAsset.LoadSingle:
                assetHolder = new AssetHolder(assetRequest.asset);
                break;

            case E_LoadAsset.LoadAll:
                assetHolder = new AssetHolder(assetRequest.allAssets);
                break;
            }

            T getter = new T();

            getter.SetAssetHolder(assetHolder);
            nameAssetHolders.Add(assetName, assetHolder);
#if UNITY_EDITOR
            var request = bundleAsyncs.Dequeue();
            Logger.LogWarp.Log(request.assetName + " " + request.currRequestID + " Dequeue");
#else
            bundleAsyncs.Dequeue();
#endif
            if (callback != null)
            {
                callback(getter);
            }
        }
        void LoadAssetAsync <T>(string assetName, E_LoadAsset eloadAsset, System.Action <T> callback)
            where T : IAssetGetter, new()
        {
            T      getter;
            string bundleName = GetBundleName(assetName);

            if (LoadAssetFromNameAssetHolder(assetName, bundleName, out getter))
            {
                callback(getter);
            }

            //BundleAsyncRequest bundleRequest = new BundleAsyncRequest(assetName, eloadAsset, callback);
            BundleAsyncRequest bundleRequest = new BundleAsyncRequest(assetName, eloadAsset);

            bundleAsyncs.Enqueue(bundleRequest);
            RunCoroutine.Run(CoBundleAsyncRequest <T>(bundleRequest, callback));
        }
        IEnumerator CoLoadAssetAsync <T>(AssetBundle assetBundle, string assetName, E_LoadAsset eloadAsset, System.Action <T> callback)
            where T : IAssetGetter, new()
        {
            AssetBundleRequest assetRequest = null;

            switch (eloadAsset)
            {
            case E_LoadAsset.LoadSingle:
                int    index             = assetName.LastIndexOf("/");
                string assetNameInBundle = assetName.Substring(index + 1);
                Debug.LogError(assetName + " " + assetNameInBundle);
                //assetRequest = assetBundle.LoadAssetAsync(assetName);
                assetRequest = assetBundle.LoadAssetAsync(assetNameInBundle);
                break;

            case E_LoadAsset.LoadAll:
                assetRequest = assetBundle.LoadAllAssetsAsync <Object>();
                break;
            }

            while (!assetRequest.isDone)
            {
                yield return(assetRequest);
            }

            AssetHolder assetHolder = null;

            switch (eloadAsset)
            {
            case E_LoadAsset.LoadSingle:
                assetHolder = new AssetHolder(assetRequest.asset);
                break;

            case E_LoadAsset.LoadAll:
                assetHolder = new AssetHolder(assetRequest.allAssets);
                break;
            }

            T getter = new T();

            getter.SetAssetHolder(assetHolder);
            nameAssetHolders.Add(assetName, assetHolder);

            callback(getter);
            bundleAsyncs.Dequeue();
        }
示例#5
0
        T LoadAsset <T>(string assetName, E_LoadAsset eLoadAsset)
            where T : IAssetGetter, new()
        {
            T      getter;
            string bundleName = GetBundleName(assetName);

            if (LoadAssetFromNameAssetHolder(assetName, bundleName, out getter))
            {
                return(getter);
            }

            AssetBundle bundle = LoadBundle(assetName, bundleName);

            if (bundle == null)
            {
                return(getter);
            }

            //所有bundle加载完毕
            AssetHolder assetHolder = null;

            switch (eLoadAsset)
            {
            case E_LoadAsset.LoadSingle:
                int    index             = assetName.LastIndexOf("/");
                string assetNameInBundle = assetName.Substring(index + 1);
                //Debug.LogError(assetName + " " + assetNameInBundle);

                assetHolder = new AssetHolder(bundle.LoadAsset(assetNameInBundle));
                break;

            case E_LoadAsset.LoadAll:
                assetHolder = new AssetHolder(bundle.LoadAllAssets());
                break;
            }
            getter.SetAssetHolder(assetHolder);

            nameAssetHolders.Add(assetName, assetHolder);

            return(getter);
        }
        void LoadAssetAsync <T>(string assetName, E_LoadAsset eloadAsset, System.Action <T> callback)
            where T : IAssetGetter, new()
        {
            T      getter;
            string bundleName = GetBundleName(assetName);

            if (LoadAssetFromNameAssetHolder(assetName, bundleName, out getter))
            {
                if (callback != null)
                {
                    callback(getter);
                }
                return;
            }

            BundleAsyncRequest bundleRequest = new BundleAsyncRequest(assetName, eloadAsset);

            Logger.LogWarp.Log(assetName + " request " + bundleRequest.currRequestID);
            bundleAsyncs.Enqueue(bundleRequest);
            RunCoroutine.Run(CoBundleAsyncRequest <T>(bundleRequest, callback));
        }
 public BundleAsyncRequest(string assetName, E_LoadAsset eLoadAsset)
 {
     this.assetName  = assetName;
     this.eLoadAsset = eLoadAsset;
     currRequestID   = requestID++;
 }