示例#1
0
    public IEnumerator LoadAssetAsync <T>(IAssetLoadTask <T> task) where T : UnityEngine.Object
    {
        if (task == null || task.isCancel)
        {
            yield break;
        }

        Asset <T> assetT = null;
        Object    asset  = null;

        string assetName = task.assetName;

        if (mCacheAssetDic.TryGetValue(assetName, out List <IAsset> list))
        {
            for (int i = list.Count - 1; i >= 0; --i)
            {
                if (list[i] == null || list[i].destroyed)
                {
                    list.RemoveAt(i); continue;
                }
                var t = list[i] as Asset <T>;
                if (t != null)
                {
                    list.RemoveAt(i);
                    assetT = t;
                    break;
                }
            }
        }


        if (assetT != null)
        {
            task.OnCompleted(assetT);
        }
        else
        {
#if UNITY_EDITOR
            if (AssetPath.mode == AssetMode.Editor)
            {
                mAssetDic.TryGetValue(assetName, out asset);

                if (asset == null)
                {
                    asset = UnityEditor.AssetDatabase.LoadAssetAtPath <Object>(assetName);
                    if (asset)
                    {
                        mAssetDic.Add(assetName, asset);
                    }
                }
            }
            else
#endif
            {
                mLoadTasks.Add(task);

                //不是Resources资源

                if (bundle == null)
                {
                    if (status == LoadStatus.None && task.isCancel == false)
                    {
                        yield return(LoadAsync());
                    }
                    else
                    {
                        yield return(new WaitUntil(() => status == LoadStatus.Done || task.isCancel));
                    }
                }

                if (mAssetDic.ContainsKey(assetName) == false)
                {
                    if (bundle != null && task.isCancel == false)
                    {
                        var request = bundle.LoadAssetAsync(assetName);

                        yield return(request);

                        if (request.asset != null && mAssetDic.ContainsKey(assetName) == false)
                        {
                            asset = request.asset;
                            mAssetDic.Add(assetName, asset);
                        }
                    }
                }
            }

            if (mAssetDic.ContainsKey(assetName) == false && task.isCancel == false)
            {
                ///尝试从Resources加载

                string path = AssetPath.GetResourcePath(assetName);

                ResourceRequest request = Resources.LoadAsync(path);

                yield return(request);

                if (request.asset != null && mAssetDic.ContainsKey(assetName) == false)
                {
                    asset = request.asset;

                    mAssetDic.Add(assetName, asset);
                    mResourceAssets.Add(assetName);
                }
            }


            if (asset == null)
            {
                mAssetDic.TryGetValue(assetName, out asset);
            }

            if (asset && task.isCancel == false)
            {
                if (typeof(T) == typeof(GameObject))
                {
                    var go = Object.Instantiate(asset) as GameObject;

                    assetT = new Asset <T>(assetName, this, asset, go as T);
                }
                else
                {
                    assetT = new Asset <T>(assetName, this, asset, asset as T);
                }
            }

            mLoadTasks.Remove(task);

            if (task.isCancel == false)
            {
                task.OnCompleted(assetT);
            }
            else
            {
                RemoveReference();
            }
        }
    }