Ejemplo n.º 1
0
 void Start()
 {
     // 初始化引用关系
     BundleDependencies.LoadBundleDependencies();
     // 初始化资源和bundle的对应关系
     BundleAsset.LoadBundleAssets();
 }
    /// <summary>
    /// 检测自己及依赖是否全部加载完成
    /// </summary>
    /// <param name="bundleName"></param>
    /// <returns></returns>
    private static bool RecursiveCheckLoad(string bundleName)
    {
        if (!ReferenceBundle.IsAssetBundleCraete(bundleName))
        {
            return(false);
        }

        List <string> list = BundleDependencies.GetAssetBundleDependencies(bundleName);

        if (list != null)
        {
            foreach (string tBundleName in list)
            {
                if (!ReferenceBundle.IsAssetBundleCraete(tBundleName))
                {
                    return(false);
                }
                else
                {
                    // 当前已加载 再次向下查找
                    RecursiveCheckLoad(tBundleName);
                }
            }
        }

        return(true);
    }
Ejemplo n.º 3
0
        void CollectAssetBundle()
        {
            List <string> names = new List <string>(LoadedAssetBundles.Keys);

            for (int i = 0; i < names.Count; i++)
            {
                if (LoadedAssetBundles[names[i]].m_ReferencedCount == 0)
                {
                    LoadedAssetBundles[names[i]].m_AssetBundle.Unload(false);
                    LoadedAssetBundles.Remove(names[i]);
                    BundleDependencies.Remove(names[i]);
                }
            }
            Resources.UnloadUnusedAssets();
        }
    /// <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);
    }
Ejemplo n.º 5
0
        void DecreaseRefrenceCount(string assetBundlePath)
        {
            if (LoadedAssetBundles.ContainsKey(assetBundlePath))
            {
                LoadedAssetBundles[assetBundlePath].m_ReferencedCount -= 1;
                var dependencies = BundleDependencies[assetBundlePath];
                for (int index = 0; index < dependencies.Length; index++)
                {
                    DecreaseRefrenceCount(dependencies[index]);
                }

                if (LoadedAssetBundles[assetBundlePath].m_ReferencedCount == 0)
                {
                    LoadedAssetBundles[assetBundlePath].m_AssetBundle.Unload(false);
                    LoadedAssetBundles.Remove(assetBundlePath);
                    BundleDependencies.Remove(assetBundlePath);
                }
            }
        }
    public static void ReleaseBundle(string bundleName)
    {
        BundleReference br = null;

        if (_bundleReferenceList.TryGetValue(bundleName, out br))
        {
            // 释放依赖
            List <string> dependencies = BundleDependencies.GetAssetBundleDependencies(bundleName);
            if (dependencies != null)
            {
                foreach (string dependBundleName in dependencies)
                {
                    ReleaseBundle(dependBundleName);
                }
            }

            br.refCount--;
            LogRefCount(br, -1);
        }
    }
Ejemplo n.º 7
0
    // Use this for initialization
    void Start()
    {
        // 初始化引用关系
        BundleDependencies.LoadBundleDependencies();
        // 初始化资源和bundle的对应关系
        BundleAsset.LoadBundleAssets();

        // 测试加载
        if (createType == CreateType.Bundle)
        {
            CreateBundle();
        }
        else if (createType == CreateType.Asset)
        {
            CreateAsset();
        }
        else if (createType == CreateType.GameObejct)
        {
            CreateGameObject();
        }
    }
    /// <summary>
    /// 获取一个bundle 每次获取引用计数都会加1
    /// </summary>
    /// <param name="bundleName"></param>
    /// <returns></returns>
    public static AssetBundle GetAssetBundle(string bundleName)
    {
        BundleReference br = GetBundleReference(bundleName);;

        if (br != null)
        {
            br.refCount++;
            LogRefCount(br, 1);

            // 增加依赖
            List <string> denpendencies = BundleDependencies.GetAssetBundleDependencies(bundleName);
            if (denpendencies != null)
            {
                foreach (string denpendBundleName in denpendencies)
                {
                    GetAssetBundle(denpendBundleName);
                }
            }

            return(br.assetBundle);
        }
        return(null);
    }