/// <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);
    }
Beispiel #2
0
 public AssetLoader LoadAssetAsync(string assetName, OnLoadAsset callback)
 {
     return(LoadAssetAsync("", assetName, callback));
 }
Beispiel #3
0
        public static AssetResolveLoader Load(string path, string package, Type type, OnLoadAsset onFinish = null, LoaderMode loaderMode = LoaderMode.Async)
        {
            LoaderDelgate realcallback = null;

            if (onFinish != null)
            {
                realcallback = (isOk, obj) => onFinish(isOk, obj as Object);
            }

            return(AutoNew <AssetResolveLoader>(path, realcallback, false, loaderMode, package, type, false));
        }
Beispiel #4
0
        /// <summary>
        /// Loads the asset bundle async.
        /// 'assetBundlePath',只需要填相对路径,不用填后缀,如 UI/Panel/MenuPanel,除非ab不是按AssetConfig里面配置的后缀来设置的.
        /// 'assetName',只需要填相对路径,需要加后缀,如 UI/Panel/MenuPanel.prefab
        /// </summary>
        public AssetLoader LoadAssetAsync(string assetBundleRelativePath, string assetName, OnLoadAsset callback)
        {
            // 如果是加载ab中的资源,需要填完成的路径,这跟 BuildAssetBundleOptions 有关,参考BundleBuilder.BuildAssetBundle()
            if (!string.IsNullOrEmpty(assetBundleRelativePath))
            {
                assetName = AssetConfig.GetAssetFullPathInAB(assetName);
            }

            string fullRelativePath    = AssetConfig.GetAssetBundleFullRelativePath(assetBundleRelativePath);
            string assetBundleFullPath = AssetConfig.GetGameAssetFullPath(fullRelativePath);

            LoaderCallback internelHandler = (bool isOk, object resultObject) =>
            {
                if (isOk)
                {
                    callback.Invoke(resultObject as Object);
                }
                else
                {
                    callback.Invoke(null);
                }
            };

            return(BaseLoader.Load <AssetLoader>(assetBundleFullPath, assetName, callback: internelHandler));
        }