示例#1
0
        public object LoadAsset(string assetPath, LoadMode mode)
        {
            if (string.IsNullOrEmpty(assetPath))
            {
                throw new ArgumentNullException("invalid path");
            }
            string absolutePath      = GetAbsolutePath(assetPath, mode);
            string assetName         = Path.GetFileNameWithoutExtension(absolutePath);
            string internalAssetName = GetInternalAssetName(absolutePath, assetName);

            while (true)
            {
                LoadAssetInfo info = GetLoadingAssetInfo(absolutePath, assetName);
                if (info == null)
                {
                    break;
                }
            }

            if (m_Holder.HasAsset(internalAssetName))
            {
                return(m_Holder.GetAsset(internalAssetName));
            }

            object asset = m_Loader.LoadAsset(absolutePath, mode);

            m_Holder.AddAsset(internalAssetName, asset);
            return(asset);
        }
示例#2
0
        private void OnResourceLoaderLoadAssetComplete(LoadAssetCompleteEventArgs args)
        {
            IsLoading = false;
            LoadAssetInfo info = (LoadAssetInfo)m_LoadingInfos.First.Value;

            m_LoadingInfos.RemoveFirst();

            if (args.AssetName.Equals(info.AssetName))
            {
                string internalAssetName = GetInternalAssetName(info.AssetPath, info.AssetName);

                if (args.Asset != null)
                {
                    m_Holder.AddAsset(internalAssetName, args.Asset);
                }

                LoadAssetCompleteEventArgs completeEventArgs = new LoadAssetCompleteEventArgs(args.AssetName, args.Asset, args.Error, info.UserData);
                if (info.Handler != null)
                {
                    info.Handler(completeEventArgs);
                }
                if (OnAssetLoaded != null)
                {
                    OnAssetLoaded(completeEventArgs);
                }
            }
            else
            {
                throw new DrbException("internal error");
            }

            CheckLoad();
        }
    /// <summary>
    /// 取消加载
    /// 如果正在加载中 加载成功之后会卸载,同时回调也不会触发
    /// </summary>
    /// <param name="requestId"></param>
    /// <returns></returns>
    public static void CancelLoadAssetAsync(int requestId)
    {
        LoadAssetInfo loadAssetInfo = GetLoadAssetInfo(requestId);

        if (loadAssetInfo == null)
        {
            return;
        }

        // 等待加载状态中 直接回收(如果不回收将会先加载在卸载)
        if (loadAssetInfo.step == LoadAssetStep.LoadWait)
        {
            RecoveryLoadAssetInfo(loadAssetInfo);
        }
        else
        {
            PendingLoadAssetInfo pendingLoadAssetInfo = _pendingLoadAssetInfoList[loadAssetInfo.bundleName];
            // 资源还未加载 因为在加载依赖的bundle
            if (pendingLoadAssetInfo != null)
            {
                // 取消依赖加载bundle
                RequestLoadBundle.CancelLoadBundleAsync(pendingLoadAssetInfo.reqeustId);
                RecoveryPendingLoadAssetInfo(pendingLoadAssetInfo);
                // 这时资源还未加载 直接回收
                RecoveryLoadAssetInfo(loadAssetInfo);
            }
        }
    }
 /// <summary>
 /// 进入加载
 /// </summary>
 /// <param name="loadAssetInfo"></param>
 private static void EnterLoading(LoadAssetInfo loadAssetInfo)
 {
     loadAssetInfo.step = LoadAssetStep.Loading;
     if (ResourceManager.isLog)
     {
         Debug.Log("loadAsset step 3 EnterLoading : " + loadAssetInfo.assetName);
     }
 }
 /// <summary>
 /// 进入加载回调
 /// </summary>
 /// <param name="loadAssetInfo"></param>
 private static void EnterWaitCall(LoadAssetInfo loadAssetInfo)
 {
     loadAssetInfo.step = LoadAssetStep.WaitCall;
     if (ResourceManager.isLog)
     {
         Debug.Log("loadAsset step 4 EnterWaitCall : " + loadAssetInfo.assetName);
     }
 }
示例#6
0
 /// <summary>
 /// 进入等待加载
 /// </summary>
 /// <param name="loadAssetInfo"></param>
 private static void EnterLoadWait(LoadAssetInfo loadAssetInfo)
 {
     loadAssetInfo.step = LoadAssetStep.LoadWait;
     if (ResourceUtil.isLog)
     {
         Debug.Log("loadAsset step 1 EnterLoadWait : " + loadAssetInfo.assetName);
     }
 }
 /// <summary>
 /// 进入依赖加载
 /// </summary>
 /// <param name="loadAssetInfo"></param>
 private static void EnterLoadDepend(LoadAssetInfo loadAssetInfo)
 {
     loadAssetInfo.step = LoadAssetStep.LoadDepend;
     if (ResourceManager.isLog)
     {
         Debug.Log("loadAsset step 2 EnterLoadDepend : " + loadAssetInfo.assetName);
     }
 }
    /// <summary>
    /// 异步加载资源
    /// </summary>
    /// <param name="assetName">资源名</param>
    private static void LoadAssetAsync(LoadAssetInfo loadAssetInfo)
    {
        AssetBundle        assetBundle       = ReferenceBundle.GetAssetBundle(loadAssetInfo.bundleName);
        string             assetInBundleName = BundleAsset.GetAssetInBundleName(loadAssetInfo.assetName);
        AssetBundleRequest request           = assetBundle.LoadAssetAsync(assetInBundleName);

        loadAssetInfo.request = request;
        EnterLoading(loadAssetInfo);
    }
    /// <summary>
    /// 异步加载资源
    /// </summary>
    /// <param name="assetName">需要加载的资源路径</param>
    /// <param name="onLoadAsset">加载成功之后的回调</param>
    /// <returns>请求Id</returns>
    public static int LoadAssetAsync(string assetName, OnLoadAsset onLoadAsset)
    {
        // 回调不存在不允加载
        if (onLoadAsset == null)
        {
            GameLogger.LogError("[资源加载错误] 加载函数回调不能为空,加载后也没有引用");
            return(0);
        }

        // 资源对应bundle名
        string abName = BundleAsset.GetBundleName(assetName);

        if (abName == null)
        {
            GameLogger.LogError("[资源加载错误] 找不到资源 ", assetName);
            return(0);
        }

        // 获取请求ID
        int requestId = ResourceManager.GetRequestId();

        LoadAssetInfo loadAssetInfo = GetTempLoadAssetInfo();

        loadAssetInfo.requestId   = requestId;
        loadAssetInfo.assetName   = assetName;
        loadAssetInfo.onLoadAsset = onLoadAsset;
        loadAssetInfo.bundleName  = abName;
        EnterLoadWait(loadAssetInfo);

        // 1 asset是否已加载
        if (ReferenceObject.IsObjectCreate(loadAssetInfo.assetName))
        {
            EnterWaitCall(loadAssetInfo);
        }

        // 2 bundle是否已加载
        else if (!ReferenceBundle.IsAssetBundleCraete(abName))
        {
            PushPending(loadAssetInfo);
        }

        // 3 从bundle加载资源
        else
        {
            List <LoadAssetInfo> loadingAssetList = GetLoadAssetStateList(LoadAssetStep.Loading);
            if (loadingAssetList.Count < _frameLoadMaxCount)
            {
                LoadAssetAsync(loadAssetInfo);
            }
        }

        _loadAssetInfoList.Add(loadAssetInfo);

        return(requestId);
    }
        //更新加载资源
        private void UpdateLoadAssetInfos()
        {
            if (m_LoadAssetInfos.Count > 0)
            {
                int count = 0;
                for (index = 0; index < m_LoadAssetInfos.Count && count < m_LoadAssetCountPerFrame;)
                {
                    LoadAssetInfo loadAssetInfo = m_LoadAssetInfos[index];
                    float         elapseSeconds = (float)(DateTime.Now - loadAssetInfo.StartTime).TotalSeconds;
                    if (elapseSeconds >= loadAssetInfo.DelaySeconds)
                    {
                        UnityEngine.Object asset = null;
#if UNITY_EDITOR
                        if (loadAssetInfo.AssetType != null)
                        {
                            asset = UnityEditor.AssetDatabase.LoadAssetAtPath(loadAssetInfo.AssetName, loadAssetInfo.AssetType);
                        }
                        else
                        {
                            asset = UnityEditor.AssetDatabase.LoadMainAssetAtPath(loadAssetInfo.AssetName);
                        }
#endif

                        if (asset != null)
                        {
                            if (loadAssetInfo.LoadAssetCallbacks.LoadAssetSuccessCallback != null)
                            {
                                loadAssetInfo.LoadAssetCallbacks.LoadAssetSuccessCallback.Invoke(loadAssetInfo.AssetName, asset, elapseSeconds, loadAssetInfo.UserData);
                            }
                        }
                        else
                        {
                            if (loadAssetInfo.LoadAssetCallbacks.LoadAssetFailureCallback != null)
                            {
                                loadAssetInfo.LoadAssetCallbacks.LoadAssetFailureCallback.Invoke(loadAssetInfo.AssetName, LoadResourceStatus.NotExist, "Can not load this asset from asset database.", loadAssetInfo.UserData);
                            }
                        }

                        m_LoadAssetInfos.RemoveAt(index); //移除
                        count++;                          //加载的数量+1
                    }
                    else
                    {
                        index++;    //进行下一次循环
                        if (loadAssetInfo.LoadAssetCallbacks.LoadAssetUpdateCallback != null)
                        {
                            loadAssetInfo.LoadAssetCallbacks.LoadAssetUpdateCallback.Invoke(loadAssetInfo.AssetName, elapseSeconds / loadAssetInfo.DelaySeconds, loadAssetInfo.UserData);
                        }
                    }
                }
            }
        }
    /// <summary>
    /// 获取一个临时asset加载信息
    /// </summary>
    /// <returns></returns>
    private static LoadAssetInfo GetTempLoadAssetInfo()
    {
        LoadAssetInfo assetInfo = null;

        if (_freeLoadAssetInfoList.Count > 0)
        {
            assetInfo = _freeLoadAssetInfoList[0];
            _freeLoadAssetInfoList.RemoveAt(0);
        }
        else
        {
            assetInfo = new LoadAssetInfo();
        }

        return(assetInfo);
    }
    /// <summary>
    ///依赖bundle加载状态
    /// </summary>
    /// <param name="loadAssetInfo"></param>
    private static void PushPending(LoadAssetInfo loadAssetInfo)
    {
        EnterLoadDepend(loadAssetInfo);
        string bundleName = loadAssetInfo.bundleName;

        if (!_pendingLoadAssetInfoList.ContainsKey(bundleName))
        {
            // 加载bundle
            int abRequestId = ResourceUtils.CreateAssetBundleAsync(bundleName, OnLoadPeningBundle);
            PendingLoadAssetInfo pendingInfo = new PendingLoadAssetInfo();
            pendingInfo            = GetTempPendingLoadAssetInfo();
            pendingInfo.reqeustId  = abRequestId;
            pendingInfo.bundleName = bundleName;
            _pendingLoadAssetInfoList.Add(bundleName, pendingInfo);
        }
    }
示例#13
0
 public void LoadAsync(string assetName, IResLoadListener listener)
 {
     for (int i = 0; i < mInLoads.Count; i++)
     {
         if (mInLoads[i].assetName == assetName)
         {
             if (!mInLoads[i].listeners.Contains(listener))
             {
                 mInLoads[i].listeners.Add(listener);
             }
             return;
         }
     }
     ResourceRequest request = Resources.LoadAsync(assetName);
     LoadAssetInfo load = new LoadAssetInfo(request, assetName);
     load.listeners.Add(listener);
     mInLoads.Add(load);
 }
示例#14
0
        public object LoadAssetFromAssetBundle(string assetBundlePath, string assetName, LoadMode mode)
        {
            if (string.IsNullOrEmpty(assetBundlePath))
            {
                throw new ArgumentNullException("invalid path");
            }
            string assetBundleAbsolutePath = GetAbsolutePath(assetBundlePath, mode);
            string internalAssetName       = GetInternalAssetName(assetBundleAbsolutePath, assetName);

            while (true)
            {
                LoadAssetInfo info = GetLoadingAssetInfo(assetBundleAbsolutePath, assetName);
                if (info == null)
                {
                    break;
                }
            }

            if (m_Holder.HasAsset(internalAssetName))
            {
                return(m_Holder.GetAsset(internalAssetName));
            }

            object assetBundle = null;

            if (m_Holder.HasAssetBundle(assetBundleAbsolutePath))
            {
                assetBundle = m_Holder.GetAssetBundle(assetBundleAbsolutePath);
            }
            else
            {
                assetBundle = LoadAssetBundle(assetBundlePath, mode);
            }

            if (assetBundle == null)
            {
                return(null);
            }

            object asset = m_Loader.LoadAssetFromAssetBundle(assetBundle, assetName, mode);

            m_Holder.AddAsset(internalAssetName, asset);
            return(asset);
        }
示例#15
0
        public void LoadAssetFromAssetBundleAsync(string assetBundlePath, string assetName, LoadMode mode, LoadAssetCompleteEventHandler onComplete, object userData)
        {
            if (string.IsNullOrEmpty(assetBundlePath))
            {
                throw new ArgumentNullException("invalid path");
            }
            string absolutePath      = GetAbsolutePath(assetBundlePath, mode);
            string internalAssetName = GetInternalAssetName(absolutePath, assetName);

            if (m_Holder.HasAsset(internalAssetName))
            {
                if (onComplete != null)
                {
                    onComplete(new LoadAssetCompleteEventArgs(assetName, m_Holder.GetAsset(internalAssetName), null, userData));
                }
                return;
            }
            LoadAssetInfo info = GetLoadingAssetInfo(absolutePath, assetName);

            if (info != null)
            {
                info.Handler += onComplete;
                info.UserData = userData;
            }
            else
            {
                info = new LoadAssetInfo()
                {
                    AssetPath     = absolutePath,
                    AssetName     = assetName,
                    Mode          = mode,
                    IsAssetBundle = true,
                    Handler       = onComplete,
                    UserData      = userData
                };

                if (!m_Holder.HasAssetBundle(absolutePath))
                {
                    LoadAssetBundleAsync(assetBundlePath, mode, null, info);
                }
                m_LoadingInfos.AddLast(info);
                CheckLoad();
            }
        }
    /// <summary>
    /// 获取某一步的列表
    /// </summary>
    /// <param name="step"></param>
    /// <returns></returns>
    private static List <LoadAssetInfo> GetLoadAssetStateList(LoadAssetStep step, bool isDelete = false)
    {
        List <LoadAssetInfo> list = new List <LoadAssetInfo>();

        for (int i = _loadAssetInfoList.Count - 1; i >= 0; i--)
        {
            LoadAssetInfo loadAssetInfo = _loadAssetInfoList[i];
            if (step == loadAssetInfo.step)
            {
                list.Add(loadAssetInfo);
                if (isDelete)
                {
                    _loadAssetInfoList.RemoveAt(i);
                }
            }
        }

        return(list);
    }
    /// <summary>
    /// 回收资源加载信息
    /// </summary>
    /// <param name="assetInfo">asset加载信息</param>
    private static void RecoveryLoadAssetInfo(LoadAssetInfo info)
    {
        if (info == null)
        {
            return;
        }


        foreach (LoadAssetInfo loadAssetInfo in _loadAssetInfoList)
        {
            if (loadAssetInfo == info)
            {
                _loadAssetInfoList.Remove(loadAssetInfo);
                break;
            }
        }

        info.Clear();
        _freeLoadAssetInfoList.Add(info);
    }
示例#18
0
        private void CheckLoad()
        {
            if (IsLoading)
            {
                return;
            }

            if (m_LoadingInfos.Count == 0)
            {
                return;
            }
            IsLoading = true;
            ILoadInfo info = m_LoadingInfos.First.Value;

            if (info is LoadAssetBundleInfo)
            {
                LoadAssetBundleInfo loadAssetBundleInfo = (LoadAssetBundleInfo)info;
                m_Loader.LoadAssetBundleBytesAsync(loadAssetBundleInfo.AssetBundlePath, loadAssetBundleInfo.Mode);
            }
            else if (info is LoadAssetInfo)
            {
                LoadAssetInfo loadAssetInfo = (LoadAssetInfo)info;
                if (loadAssetInfo.IsAssetBundle)
                {
                    if (m_Holder.HasAssetBundle(loadAssetInfo.AssetPath))
                    {
                        m_Loader.LoadAssetFromAssetBundleAsync(m_Holder.GetAssetBundle(loadAssetInfo.AssetPath), loadAssetInfo.AssetName, loadAssetInfo.Mode);
                    }
                    else
                    {
                        //加载assetbundle失败
                        OnResourceLoaderLoadAssetComplete(new LoadAssetCompleteEventArgs(loadAssetInfo.AssetName, null, string.Format("asset bundle '{0}' not exists", loadAssetInfo.AssetPath), loadAssetInfo.UserData));
                    }
                }
                else
                {
                    m_Loader.LoadAssetAsync(loadAssetInfo.AssetPath, loadAssetInfo.Mode);
                }
            }
        }
 /// <summary>
 /// 进入加载回调
 /// </summary>
 /// <param name="loadAssetInfo"></param>
 private static void EnterWaitCall(LoadAssetInfo loadAssetInfo)
 {
     loadAssetInfo.step = LoadAssetStep.WaitCall;
     Debug.Log("loadAsset step 4 EnterWaitCall : " + loadAssetInfo.assetName);
 }
 /// <summary>
 /// 进入加载
 /// </summary>
 /// <param name="loadAssetInfo"></param>
 private static void EnterLoading(LoadAssetInfo loadAssetInfo)
 {
     loadAssetInfo.step = LoadAssetStep.Loading;
     Debug.Log("loadAsset step 3 EnterLoading : " + loadAssetInfo.assetName);
 }
 /// <summary>
 /// 进入依赖加载
 /// </summary>
 /// <param name="loadAssetInfo"></param>
 private static void EnterLoadDepend(LoadAssetInfo loadAssetInfo)
 {
     loadAssetInfo.step = LoadAssetStep.LoadDepend;
     Debug.Log("loadAsset step 2 EnterLoadDepend : " + loadAssetInfo.assetName);
 }
 /// <summary>
 /// 进入等待加载
 /// </summary>
 /// <param name="loadAssetInfo"></param>
 private static void EnterLoadWait(LoadAssetInfo loadAssetInfo)
 {
     loadAssetInfo.step = LoadAssetStep.LoadWait;
     Debug.Log("loadAsset step 1 EnterLoadWait : " + loadAssetInfo.assetName);
 }
 /// <summary>
 /// 回收资源加载信息
 /// </summary>
 /// <param name="assetInfo">asset加载信息</param>
 private static void RecoveryLoadAssetInfo(LoadAssetInfo info)
 {
     info.Clear();
     _freeLoadAssetInfoList.Add(info);
 }
示例#24
0
        private void Update()
        {
            if (m_LoadAssetInfos.Count > 0)
            {
                int count = 0;
                LinkedListNode <LoadAssetInfo> current = m_LoadAssetInfos.First;
                while (current != null && count < m_LoadAssetCountPerFrame)
                {
                    LoadAssetInfo loadAssetInfo = current.Value;
                    float         elapseSeconds = (float)(DateTime.Now - loadAssetInfo.StartTime).TotalSeconds;
                    if (elapseSeconds >= loadAssetInfo.DelaySeconds)
                    {
                        UnityEngine.Object asset = null;
#if UNITY_EDITOR
                        if (loadAssetInfo.AssetType != null)
                        {
                            asset = UnityEditor.AssetDatabase.LoadAssetAtPath(loadAssetInfo.AssetName, loadAssetInfo.AssetType);
                        }
                        else
                        {
                            asset = UnityEditor.AssetDatabase.LoadMainAssetAtPath(loadAssetInfo.AssetName);
                        }
#endif

                        if (asset != null)
                        {
                            if (loadAssetInfo.LoadAssetCallbacks.LoadAssetSuccessCallback != null)
                            {
                                loadAssetInfo.LoadAssetCallbacks.LoadAssetSuccessCallback(loadAssetInfo.AssetName, asset, elapseSeconds, loadAssetInfo.UserData);
                            }
                        }
                        else
                        {
                            if (loadAssetInfo.LoadAssetCallbacks.LoadAssetFailureCallback != null)
                            {
                                loadAssetInfo.LoadAssetCallbacks.LoadAssetFailureCallback(loadAssetInfo.AssetName, LoadResourceStatus.NotExist, "Can not load this asset from asset database.", loadAssetInfo.UserData);
                            }
                        }

                        LinkedListNode <LoadAssetInfo> next = current.Next;
                        m_LoadAssetInfos.Remove(loadAssetInfo);
                        current = next;
                        count++;
                    }
                    else
                    {
                        if (loadAssetInfo.LoadAssetCallbacks.LoadAssetUpdateCallback != null)
                        {
                            loadAssetInfo.LoadAssetCallbacks.LoadAssetUpdateCallback(loadAssetInfo.AssetName, elapseSeconds / loadAssetInfo.DelaySeconds, loadAssetInfo.UserData);
                        }

                        current = current.Next;
                    }
                }
            }

            if (m_LoadSceneInfos.Count > 0)
            {
                LinkedListNode <LoadSceneInfo> current = m_LoadSceneInfos.First;
                while (current != null)
                {
                    LoadSceneInfo loadSceneInfo = current.Value;
                    if (loadSceneInfo.AsyncOperation.isDone)
                    {
                        if (loadSceneInfo.AsyncOperation.allowSceneActivation)
                        {
                            if (loadSceneInfo.LoadSceneCallbacks.LoadSceneSuccessCallback != null)
                            {
                                loadSceneInfo.LoadSceneCallbacks.LoadSceneSuccessCallback(loadSceneInfo.SceneAssetName, (float)(DateTime.Now - loadSceneInfo.StartTime).TotalSeconds, loadSceneInfo.UserData);
                            }
                        }
                        else
                        {
                            if (loadSceneInfo.LoadSceneCallbacks.LoadSceneFailureCallback != null)
                            {
                                loadSceneInfo.LoadSceneCallbacks.LoadSceneFailureCallback(loadSceneInfo.SceneAssetName, LoadResourceStatus.NotExist, "Can not load this scene from asset database.", loadSceneInfo.UserData);
                            }
                        }

                        LinkedListNode <LoadSceneInfo> next = current.Next;
                        m_LoadSceneInfos.Remove(loadSceneInfo);
                        current = next;
                    }
                    else
                    {
                        if (loadSceneInfo.LoadSceneCallbacks.LoadSceneUpdateCallback != null)
                        {
                            loadSceneInfo.LoadSceneCallbacks.LoadSceneUpdateCallback(loadSceneInfo.SceneAssetName, loadSceneInfo.AsyncOperation.progress, loadSceneInfo.UserData);
                        }

                        current = current.Next;
                    }
                }
            }

            if (m_UnloadSceneInfos.Count > 0)
            {
                LinkedListNode <UnloadSceneInfo> current = m_UnloadSceneInfos.First;
                while (current != null)
                {
                    UnloadSceneInfo unloadSceneInfo = current.Value;
                    if (unloadSceneInfo.AsyncOperation.isDone)
                    {
                        if (unloadSceneInfo.AsyncOperation.allowSceneActivation)
                        {
                            if (unloadSceneInfo.UnloadSceneCallbacks.UnloadSceneSuccessCallback != null)
                            {
                                unloadSceneInfo.UnloadSceneCallbacks.UnloadSceneSuccessCallback(unloadSceneInfo.SceneAssetName, unloadSceneInfo.UserData);
                            }
                        }
                        else
                        {
                            if (unloadSceneInfo.UnloadSceneCallbacks.UnloadSceneFailureCallback != null)
                            {
                                unloadSceneInfo.UnloadSceneCallbacks.UnloadSceneFailureCallback(unloadSceneInfo.SceneAssetName, unloadSceneInfo.UserData);
                            }
                        }

                        LinkedListNode <UnloadSceneInfo> next = current.Next;
                        m_UnloadSceneInfos.Remove(unloadSceneInfo);
                        current = next;
                    }
                    else
                    {
                        current = current.Next;
                    }
                }
            }
        }
示例#25
0
        private void Update()
        {
            if (m_LoadAssetInfos.Count > 0)
            {
                LinkedListNode <LoadAssetInfo> current = m_LoadAssetInfos.First;
                while (current != null)
                {
                    LoadAssetInfo loadAssetInfo = current.Value;
                    float         elapseSeconds = (float)(DateTime.Now - loadAssetInfo.StartTime).TotalSeconds;
                    if (elapseSeconds >= loadAssetInfo.DelaySeconds)
                    {
                        UnityEngine.Object asset = null;
#if UNITY_EDITOR
                        if (loadAssetInfo.AssetType != null)
                        {
                            asset = AssetDatabase.LoadAssetAtPath(loadAssetInfo.AssetName, loadAssetInfo.AssetType);
                        }
                        else
                        {
                            asset = AssetDatabase.LoadMainAssetAtPath(loadAssetInfo.AssetName);
                        }
#endif

                        if (asset != null)
                        {
                            if (loadAssetInfo.LoadAssetCallbacks.LoadAssetSuccessCallback != null)
                            {
                                loadAssetInfo.LoadAssetCallbacks.LoadAssetSuccessCallback(loadAssetInfo.AssetName, asset, elapseSeconds, loadAssetInfo.UserData);
                            }
                        }
                        else
                        {
                            if (loadAssetInfo.LoadAssetCallbacks.LoadAssetFailureCallback != null)
                            {
                                loadAssetInfo.LoadAssetCallbacks.LoadAssetFailureCallback(loadAssetInfo.AssetName, LoadResourceStatus.NotExist, "Can not load this asset from asset database.", loadAssetInfo.UserData);
                            }
                        }

                        LinkedListNode <LoadAssetInfo> next = current.Next;
                        m_LoadAssetInfos.Remove(loadAssetInfo);
                        current = next;
                    }
                    else
                    {
                        if (loadAssetInfo.LoadAssetCallbacks.LoadAssetUpdateCallback != null)
                        {
                            loadAssetInfo.LoadAssetCallbacks.LoadAssetUpdateCallback(loadAssetInfo.AssetName, elapseSeconds / loadAssetInfo.DelaySeconds, loadAssetInfo.UserData);
                        }

                        current = current.Next;
                    }
                }
            }
            else
            {
                if (_startLoadAssets)
                {
                    _startLoadAssets = false;
                    _loadAssetsComplete(this,
                                        new GameFramework.Resource.
                                        LoadAssetsCompleteEventArgs
                                            (_assetNames.ToArray(), _assets.ToArray(), _duration, _userData));
                    _clerCache();
                }
            }

            if (m_LoadSceneInfos.Count > 0)
            {
                LinkedListNode <LoadSceneInfo> current = m_LoadSceneInfos.First;
                while (current != null)
                {
                    LoadSceneInfo loadSceneInfo = current.Value;
                    if (loadSceneInfo.AsyncOperation.isDone)
                    {
                        if (loadSceneInfo.AsyncOperation.allowSceneActivation)
                        {
                            if (loadSceneInfo.LoadSceneCallbacks.LoadSceneSuccessCallback != null)
                            {
                                loadSceneInfo.LoadSceneCallbacks.LoadSceneSuccessCallback(loadSceneInfo.SceneAssetName, (float)(DateTime.Now - loadSceneInfo.StartTime).TotalSeconds, loadSceneInfo.UserData);
                            }
                        }
                        else
                        {
                            if (loadSceneInfo.LoadSceneCallbacks.LoadSceneFailureCallback != null)
                            {
                                loadSceneInfo.LoadSceneCallbacks.LoadSceneFailureCallback(loadSceneInfo.SceneAssetName, LoadResourceStatus.NotExist, "Can not load this scene from asset database.", loadSceneInfo.UserData);
                            }
                        }

                        LinkedListNode <LoadSceneInfo> next = current.Next;
                        m_LoadSceneInfos.Remove(loadSceneInfo);
                        current = next;
                    }
                    else
                    {
                        if (loadSceneInfo.LoadSceneCallbacks.LoadSceneUpdateCallback != null)
                        {
                            loadSceneInfo.LoadSceneCallbacks.LoadSceneUpdateCallback(loadSceneInfo.SceneAssetName, loadSceneInfo.AsyncOperation.progress, loadSceneInfo.UserData);
                        }

                        current = current.Next;
                    }
                }
            }

            if (m_UnloadSceneInfos.Count > 0)
            {
                LinkedListNode <UnloadSceneInfo> current = m_UnloadSceneInfos.First;
                while (current != null)
                {
                    UnloadSceneInfo unloadSceneInfo = current.Value;
                    if (unloadSceneInfo.AsyncOperation.isDone)
                    {
                        if (unloadSceneInfo.AsyncOperation.allowSceneActivation)
                        {
                            if (unloadSceneInfo.UnloadSceneCallbacks.UnloadSceneSuccessCallback != null)
                            {
                                unloadSceneInfo.UnloadSceneCallbacks.UnloadSceneSuccessCallback(unloadSceneInfo.SceneAssetName, unloadSceneInfo.UserData);
                            }
                        }
                        else
                        {
                            if (unloadSceneInfo.UnloadSceneCallbacks.UnloadSceneFailureCallback != null)
                            {
                                unloadSceneInfo.UnloadSceneCallbacks.UnloadSceneFailureCallback(unloadSceneInfo.SceneAssetName, unloadSceneInfo.UserData);
                            }
                        }

                        LinkedListNode <UnloadSceneInfo> next = current.Next;
                        m_UnloadSceneInfos.Remove(unloadSceneInfo);
                        current = next;
                    }
                    else
                    {
                        current = current.Next;
                    }
                }
            }
        }