Exemplo n.º 1
0
        public void LoadAssetBundleAsync(string assetBundlePath, LoadMode mode, LoadAssetBundleCompleteEventHandler onComplete, object userData)
        {
            if (string.IsNullOrEmpty(assetBundlePath))
            {
                throw new ArgumentNullException("invalid path");
            }
            string assetBundleAbsolutePath = GetAbsolutePath(assetBundlePath, mode);

            if (m_Holder.HasAssetBundle(assetBundleAbsolutePath))
            {
                object assetBundle = m_Holder.GetAssetBundle(assetBundleAbsolutePath);
                if (onComplete != null)
                {
                    onComplete(new LoadAssetBundleCompleteEventArgs(assetBundlePath, assetBundle, null, userData));
                }
            }

            LoadAssetBundleInfo info = GetLoadingAssetBundleInfo(assetBundleAbsolutePath);

            if (info != null)
            {
                info.Handler += onComplete;
                info.UserData = userData;
            }
            else
            {
                info = new LoadAssetBundleInfo();
                info.AssetBundlePath = assetBundleAbsolutePath;
                info.Mode            = mode;
                info.Handler         = onComplete;
                info.UserData        = userData;
                if (m_DependencyManifest != null)
                {
                    string[] dependencies = m_DependencyManifest.GetAllDependencies(assetBundlePath);

                    if (dependencies != null && dependencies.Length > 0)
                    {
                        for (int i = 0; i < dependencies.Length; ++i)
                        {
                            string depPath = GetAbsolutePath(dependencies[i], mode);
                            if (!m_Holder.HasAssetBundle(depPath) && !IsLoadingAssetBundle(depPath))
                            {
                                LoadAssetBundleAsync(dependencies[i], mode, null, null);
                            }
                        }
                    }
                }

                m_LoadingInfos.AddLast(info);

                CheckLoad();
            }
        }
Exemplo n.º 2
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);
                }
            }
        }
Exemplo n.º 3
0
        public object LoadAssetBundle(string assetBundlePath, LoadMode mode)
        {
            if (string.IsNullOrEmpty(assetBundlePath))
            {
                throw new ArgumentNullException("invalid path");
            }
            string assetBundleAbsolutePath = GetAbsolutePath(assetBundlePath, mode);

            while (true)
            {
                LoadAssetBundleInfo info = GetLoadingAssetBundleInfo(assetBundleAbsolutePath);
                if (info == null)
                {
                    break;
                }
            }

            if (m_Holder.HasAssetBundle(assetBundleAbsolutePath))
            {
                return(m_Holder.GetAssetBundle(assetBundleAbsolutePath));
            }

            if (m_DependencyManifest != null)
            {
                string[] dependencies = m_DependencyManifest.GetAllDependencies(assetBundlePath);
                if (dependencies != null && dependencies.Length > 0)
                {
                    for (int i = 0; i < dependencies.Length; ++i)
                    {
                        LoadAssetBundle(dependencies[i], mode);
                    }
                }
            }

            byte[] data        = m_Loader.LoadAssetBundleBytes(assetBundleAbsolutePath, mode);
            object assetBundle = m_Decoder.DecodeAssetBundle(data);

            m_Holder.AddAssetBundle(assetBundleAbsolutePath, assetBundle);
            return(assetBundle);
        }