Exemple #1
0
            public CoroutineTasks.CoroutineWork LoadResAsync(string asset, Type type)
            {
                var work = new CoroutineTasks.CoroutineWorkSingle();

                work.Result = LoadRes(asset, type);
                return(work);
            }
            public static CoroutineTasks.CoroutineWork LoadAssetAsync(string asset, Type type)
            {
                var work = new CoroutineTasks.CoroutineWorkSingle();

                work.SetWork(LoadAssetAsyncWork(work, asset, type));
                return(work);
            }
                public override IEnumerator LoadAsync(CoroutineTasks.CoroutineWork req, Type type)
                {
                    var holdhandle = Hold();

                    try
                    {
                        while (AsyncWorkTimer.Check())
                        {
                            yield return(null);
                        }

                        if (MainType == null)
                        {
                            var mainwork = new CoroutineTasks.CoroutineWorkSingle();
                            mainwork.SetWork(LoadMainAssetAsync(mainwork));
                            mainwork.StartCoroutine();

                            while (true)
                            {
                                if (MainType != null)
                                {
                                    mainwork.Dispose();
                                    break;
                                }
                                if (mainwork.Done)
                                {
                                    var asset = mainwork.Result as Object;
                                    if (!asset)
                                    {
                                        MainType = typeof(object);
                                    }
                                    else
                                    {
                                        MainType = asset.GetType();
                                        TypedAssets[MainType] = new AssetRef()
                                        {
                                            Asset = new WeakReference(asset)
                                        };
                                    }
                                    if (MainType == typeof(object) || type == null || type.IsAssignableFrom(MainType))
                                    {
                                        req.Result = asset;
                                        yield break;
                                    }
                                }
                            }
                        }
                        if (MainType == typeof(object))
                        {
                            yield break;
                        }
                        else if (type == null || type.IsAssignableFrom(MainType))
                        {
                            type = MainType;
                        }

                        AssetRef rAsset;
                        if (TypedAssets.TryGetValue(type, out rAsset))
                        {
                            if (rAsset.Asset != null)
                            {
                                var asset = rAsset.Asset.GetWeakReference <Object>();
                                if (asset)
                                {
                                    req.Result = asset;
                                    yield break;
                                }
                            }
                        }

                        while (AsyncWorkTimer.Check())
                        {
                            yield return(null);
                        }
                        if (rAsset == null)
                        {
                            rAsset            = new AssetRef();
                            TypedAssets[type] = rAsset;
                        }
                        rAsset.Asset = null;

                        if (ManiItem != null && DepBundles.Count > 0)
                        {
                            var bi = DepBundles[DepBundles.Count - 1];
                            if (bi != null && bi.Bundle != null)
                            {
                                var path = ConcatAssetPath();

                                AssetBundleRequest reqraw = null;
                                try
                                {
                                    reqraw = bi.Bundle.LoadAssetAsync(path, type);
                                }
                                catch (Exception e)
                                {
                                    PlatDependant.LogError(e);
                                }
                                if (reqraw != null)
                                {
                                    yield return(reqraw);

                                    var asset = reqraw.asset;

                                    if (!asset)
                                    {
                                        yield break;
                                    }

                                    rAsset.Asset = new WeakReference(asset);
                                    req.Result   = asset;
                                }
                            }
                        }
                    }
                    finally
                    {
                        GC.KeepAlive(holdhandle);
                    }
                }
            private static IEnumerator LoadAssetAsyncWork(CoroutineTasks.CoroutineWork req, string asset, Type type)
            {
                while (AsyncWorkTimer.Check())
                {
                    yield return(null);
                }
                while (ResManager.IsCollectingGarbage)
                {
                    yield return(null);
                }
                ResManager.DelayGarbageCollectTo(System.Environment.TickCount + 10000);

#if COMPATIBLE_RESMANAGER_V1
                asset = CompatibleAssetName(asset);
#endif
                CapsResManifestNode node;
                if (CollapsedManifest.TryGetItem(asset, out node) && node.Item != null)
                {
                    var sceneitem = node.Item;
                    while (sceneitem.Ref != null)
                    {
                        sceneitem = sceneitem.Ref;
                    }
                    var scenepath = sceneitem.Node.GetFullPath();
                    int sceneindex;
                    if (IsBuiltinScene(scenepath, out sceneindex))
                    {
                        if (sceneindex >= 0)
                        {
                            yield return(UnityEngine.SceneManagement.SceneManager.LoadSceneAsync(sceneindex, type == null ? UnityEngine.SceneManagement.LoadSceneMode.Single : UnityEngine.SceneManagement.LoadSceneMode.Additive));
                        }
                        else
                        {
                            yield return(UnityEngine.SceneManagement.SceneManager.LoadSceneAsync(System.IO.Path.GetFileNameWithoutExtension(node.PPath), type == null ? UnityEngine.SceneManagement.LoadSceneMode.Single : UnityEngine.SceneManagement.LoadSceneMode.Additive));
                        }
                        ResManager.DelayGarbageCollectTo(int.MinValue);
                        //req.Result = ???
                        yield break;
                    }
                    var item = node.Item;
                    var ai   = CreateAssetInfo(item);
                    ResManager.DelayGarbageCollectTo(System.Environment.TickCount + 10000);
                    yield return(ai.PreloadAsync());

                    ResManager.DelayGarbageCollectTo(System.Environment.TickCount + 10000);
                    var work = new CoroutineTasks.CoroutineWorkSingle();
                    work.SetWork(ai.LoadAsync(work, type));
                    yield return(work);

                    req.Result = work.Result;
                }
                else
                {
                    int sceneindex;
                    if (IsBuiltinScene(asset, out sceneindex))
                    {
                        if (sceneindex >= 0)
                        {
                            yield return(UnityEngine.SceneManagement.SceneManager.LoadSceneAsync(sceneindex, type == null ? UnityEngine.SceneManagement.LoadSceneMode.Single : UnityEngine.SceneManagement.LoadSceneMode.Additive));
                        }
                        else
                        {
                            yield return(UnityEngine.SceneManagement.SceneManager.LoadSceneAsync(System.IO.Path.GetFileNameWithoutExtension(asset), type == null ? UnityEngine.SceneManagement.LoadSceneMode.Single : UnityEngine.SceneManagement.LoadSceneMode.Additive));
                        }
                        ResManager.DelayGarbageCollectTo(int.MinValue);
                        //req.Result = ???
                        yield break;
                    }
                }

                ResManager.DelayGarbageCollectTo(int.MinValue);
            }