Пример #1
0
    /// <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>
 public void CallCreateAssetBundle()
 {
     //Debug.Log("LoadBundleInfo CallCreateAssetBundle " + bundleName);
     foreach (LoadBundleRequestInfo loadBundleRequestInfo in loadBundleRequestInfoList)
     {
         AssetBundle assetBundle = ReferenceBundle.GetAssetBundle(bundleName);
         loadBundleRequestInfo.onCreateAssetBundle(bundleName, assetBundle, loadBundleRequestInfo.requestId);
     }
     RemoveAllBundleRequest();
 }
    /// <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);
    }
Пример #4
0
 // Update is called once per frame
 void Update()
 {
     // 检测 加载bundle状态  等待加载-->加载(加载依赖bundle和自己)-->完成回调
     RequestLoadBundle.Update();
     // 检测 加载asset状态   等待加载-->加载依赖bundle-->加载自己-->完成回调
     RequestLoadAsset.Update();
     // 检测 asset引用       引用计数为零卸载asset
     ReferenceObject.Update();
     // 检测 bundle引用      同上
     ReferenceBundle.Update();
 }
 public void Clear()
 {
     if (assetBundle != null)
     {
         //Debug.Log("Destory LoadBundleInfo " + bundleName);
         ReferenceBundle.ReleaseBundle(bundleName);
         assetBundle = null;
     }
     RemoveAllBundleRequest();
     bundleName = null;
     request    = null;
     step       = LoadBundleStep.None;
 }
    /// <summary>
    /// 异步加载bundle
    /// </summary>
    /// <param name="bundleName">bundle路径</param>
    /// <param name="onCreateAssetBundle">加载成功后的回调 取消加载后将回调将失效</param>
    /// <returns></returns>
    public static int CreateAssetBundleAsync(int requestId, string bundleName, OnCreateAssetBundle onCreateAssetBundle)
    {
        // 回调不存在不允加载
        if (onCreateAssetBundle == null)
        {
            return(0);
        }

        LoadBundleInfo loadBundleInfo = GetLoadBundleInfo(bundleName);

        if (loadBundleInfo == null)
        {
            loadBundleInfo = GetTempLoadBundleInfo();
            _loadBundleInfoList.Add(bundleName, loadBundleInfo);
            loadBundleInfo.bundleName = bundleName;
            EnterLoadWait(loadBundleInfo);
        }

        requestId = loadBundleInfo.CreateBundleRequest(requestId, onCreateAssetBundle);
        // 未请求
        if (loadBundleInfo.step == LoadBundleStep.LoadWait)
        {
            // 1 获取依赖列表
            List <string> dependencies = BundleDependencies.GetAssetBundleDependencies(bundleName);
            // 2 递归请求加载
            if (dependencies != null && dependencies.Count > 0)
            {
                foreach (string tempBundleName in dependencies)
                {
                    CreateAssetBundleAsync(requestId, tempBundleName, (string tBundleName, AssetBundle tAssetBundle, int tRequestId) => {
                        // 回调返回会增加引用 所以这里直接释放
                        ReferenceBundle.ReleaseBundle(tBundleName);
                    });
                }
            }
            // 3 正加载列表
            List <LoadBundleInfo> loadingBundleInfoList = GetLoadBundleStateList(LoadBundleStep.Loading);
            if (loadingBundleInfoList.Count < _frameLoadMaxCount)
            {
                LoadAssetBundle(loadBundleInfo);
            }
        }

        return(requestId);
    }
 public void Clear()
 {
     if (asset != null)
     {
         ReferenceObject.ReleaseObject(assetName);
         asset = null;
     }
     if (assetBundle != null)
     {
         ReferenceBundle.ReleaseBundle(bundleName);
         assetBundle = null;
     }
     step        = LoadAssetStep.None;
     bundleName  = null;
     requestId   = 0;
     request     = null;
     assetName   = null;
     onLoadAsset = null;
 }
Пример #8
0
 public static void DestoryAssetBundle(string bundleName)
 {
     ReferenceBundle.ReleaseBundle(bundleName);
 }