IEnumerator CoBundleAsyncRequest <T>(BundleAsyncRequest bundleRequest, System.Action <T> callback)
            where T : IAssetGetter, new()
        {
            while (bundleRequest.currRequestID != bundleAsyncs.Peek().currRequestID)
            {
                Logger.LogWarp.Log(bundleRequest.currRequestID + " != " + bundleAsyncs.Peek().currRequestID + " waiting...");
                yield return(null);
            }

            //等待完bundleRequest再次检查有没有被加载过。防止同一资源加载出错
            Logger.LogWarp.Log(bundleRequest.currRequestID + " wait finished!");
            string bundleName = GetBundleName(bundleRequest.assetName);
            T      getter;

            if (LoadAssetFromNameAssetHolder(bundleRequest.assetName, bundleName, out getter))
            {
                if (callback != null)
                {
                    callback(getter);
                }
                bundleAsyncs.Dequeue();
                yield break;
            }

            yield return(CoLoadBundleAsync <T>(bundleRequest.assetName, bundleName, bundleRequest.eLoadAsset, callback));
        }
        IEnumerator CoBundleAsyncRequest <T>(BundleAsyncRequest bundleRequest, System.Action <T> callback)
            where T : IAssetGetter, new()
        {
            while (bundleRequest.currRequestID != bundleAsyncs.Peek().currRequestID)
            {
                yield return(null);
            }

            string bundleName = GetBundleName(bundleRequest.assetName);

            Debug.LogError("[" + bundleName + "] [" + bundleRequest.assetName + "]");
            yield return(CoLoadBundleAsync <T>(bundleRequest.assetName, bundleName, bundleRequest.eLoadAsset, callback));
        }
        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));
        }
        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));
        }