Example #1
0
    //异步加载协程
    IEnumerator AsyncLoadCor()
    {
        //回调队列
        List <AsyncLoadResCallBackInfo> callBackList = null;

        long lastYieldTime = System.DateTime.Now.Ticks;

        while (true)
        {
            bool haveYield = false;
            //遍历需加载资源队列
            for (int i = 0; i < (int)LoadResPriority.RES_NUM; i++)
            {
                List <AsyncLoadResInfo> loadingList = m_LoadingAssetList[i];
                if (loadingList.Count <= 0)
                {
                    continue;
                }

                AsyncLoadResInfo loadingItem = loadingList[0];
                loadingList.RemoveAt(0);
                //取出回调
                callBackList = loadingItem.m_CallBackList;

                Object       obj  = null;
                ResourceItem item = null;
#if UNITY_EDITOR
                if (!m_loadFromAssetBundle)
                {
                    obj = LoadAssetByEditor <Object>(loadingItem.m_Path);
                    //模拟异步加载
                    yield return(new WaitForSeconds(0.5f));

                    item = AssetBundleMgr.Instance.GetResourceItem(loadingItem.m_Crc);
                }
#endif
                if (obj == null)
                {
                    item = AssetBundleMgr.Instance.LoadResourceAssetBundle(loadingItem.m_Crc);
                    if (item != null && item.m_AssetBundle != null)
                    {
                        AssetBundleRequest abRequest = null;
                        if (loadingItem.isSprite)
                        {
                            abRequest = item.m_AssetBundle.LoadAssetAsync <Sprite>(item.m_AssetName);
                        }
                        else
                        {
                            abRequest = item.m_AssetBundle.LoadAssetAsync(item.m_AssetName);
                        }

                        yield return(abRequest);

                        if (abRequest.isDone)
                        {
                            obj = abRequest.asset;
                        }

                        lastYieldTime = System.DateTime.Now.Ticks;
                    }
                }

                CacheResource(loadingItem.m_Path, ref item, loadingItem.m_Crc, obj, callBackList.Count);
                for (int j = 0; j < callBackList.Count; j++)
                {
                    AsyncLoadResCallBackInfo callBack = callBackList[j];
                    if (callBack != null && callBack.m_DealFinish != null)
                    {
                        callBack.m_DealFinish(loadingItem.m_Path, obj, callBack.m_Param1, callBack.m_Param2,
                                              callBack.m_Param3);//执行回调
                        callBack.m_DealFinish = null;
                    }

                    callBack.Reset();
                    m_AsyncCallBackPool.Recycle(callBack);
                }


                obj = null;
                callBackList.Clear();
                m_LoadingAssetDic.Remove(loadingItem.m_Crc);
                loadingItem.Reset();
                m_AsyncLoadResParamPool.Recycle(loadingItem);

                if (System.DateTime.Now.Ticks - lastYieldTime > MAXLOADRESTIME)//大于这个时间等待一帧
                {
                    yield return(null);

                    lastYieldTime = System.DateTime.Now.Ticks;
                    haveYield     = true;
                }
            }

            if (!haveYield || System.DateTime.Now.Ticks - lastYieldTime > MAXLOADRESTIME)//大于这个时间等待一帧
            {
                lastYieldTime = System.DateTime.Now.Ticks;
            }

            yield return(null);
        }
    }