Ejemplo n.º 1
0
    IEnumerator _Init(string path, string assetName)
    {
        IsLoadAssetBundle = CCosmosEngine.GetConfig("IsLoadAssetBundle").ToInt32() != 0;
        AssetInBundleName = assetName;

        UnityEngine.Object getAsset = null;
        if (!IsLoadAssetBundle)
        {
            string extension = System.IO.Path.GetExtension(path);
            path = path.Substring(0, path.Length - extension.Length);  // remove extensions

            getAsset = Resources.Load <UnityEngine.Object>(path);
            if (getAsset == null)
            {
                CDebug.LogError("Asset is NULL(from Resources Folder): {0}", path);
            }
            OnFinish(getAsset);
        }
        else
        {
            var bundleLoader = CAssetBundleLoader.Load(path);

            while (!bundleLoader.IsFinished)
            {
                if (IsReadyDisposed)   // 中途释放
                {
                    bundleLoader.Release();
                    OnFinish(null);
                    yield break;
                }
                Progress = bundleLoader.Progress;
                yield return(null);
            }
            var assetBundle = bundleLoader.Bundle;

            System.DateTime beginTime = System.DateTime.Now;
            if (AssetInBundleName == null)
            {
                // 经过AddWatch调试,.mainAsset这个getter第一次执行时特别久,要做序列化
                //AssetBundleRequest request = assetBundle.LoadAsync("", typeof(Object));// mainAsset
                //while (!request.isDone)
                //{
                //    yield return null;
                //}
                try
                {
                    CDebug.Assert(getAsset = assetBundle.mainAsset);
                }
                catch
                {
                    CDebug.LogError("[OnAssetBundleLoaded:mainAsset]{0}", path);
                }
            }
            else
            {
                // TODO: 未测试过这几行!~~
                AssetBundleRequest request = assetBundle.LoadAsync(AssetInBundleName, typeof(Object));
                while (!request.isDone)
                {
                    yield return(null);
                }

                getAsset = request.asset;
            }

            CResourceModule.LogLoadTime("AssetFileBridge", path, beginTime);

            if (getAsset == null)
            {
                CDebug.LogError("Asset is NULL: {0}", path);
            }

            bundleLoader.Release();  // 释放Bundle(WebStream)
        }

        if (Application.isEditor)
        {
            if (getAsset != null)
            {
                CResourceLoadObjectDebugger.Create(getAsset.GetType().Name, Url, getAsset as UnityEngine.Object);
            }
        }

        if (getAsset != null)
        {
            // 更名~ 注明来源asset bundle 带有类型
            getAsset.name = string.Format("{0}~{1}", getAsset, Url);
        }
        OnFinish(getAsset);
    }
Ejemplo n.º 2
0
    /// <summary>
    /// 协和加载Assetbundle,加载完后执行callback
    /// </summary>
    /// <param name="url">资源的url</param>
    /// <param name="callback"></param>
    /// <param name="callbackArgs"></param>
    /// <returns></returns>
    IEnumerator CoLoad(string url)
    {
        CResourceModule.LogRequest("WWW", url);
        System.DateTime beginTime = System.DateTime.Now;

        // 潜规则:不用LoadFromCache~它只能用在.assetBundle
        Www = new WWW(url);

        WWWLoadingCount++;

        //设置AssetBundle解压缩线程的优先级
        Www.threadPriority = Application.backgroundLoadingPriority;  // 取用全局的加载优先速度
        while (!Www.isDone)
        {
            Progress = Www.progress;
            yield return(null);
        }

        yield return(Www);

        WWWLoadingCount--;
        Progress = 1;
        if (IsReadyDisposed)
        {
            CDebug.LogError("[CWWWLoader]Too early release: {0}", url);
            OnFinish(null);
            yield break;
        }
        if (!string.IsNullOrEmpty(Www.error))
        {
            string fileProtocol = CResourceModule.GetFileProtocol();
            if (url.StartsWith(fileProtocol))
            {
                string fileRealPath = url.Replace(fileProtocol, "");
                CDebug.LogError("File {0} Exist State: {1}", fileRealPath, System.IO.File.Exists(fileRealPath));
            }
            CDebug.LogError("[CWWWLoader:Error]" + Www.error + " " + url);

            OnFinish(null);
            yield break;
        }
        else
        {
            CResourceModule.LogLoadTime("WWW", url, beginTime);
            if (WWWFinishCallback != null)
            {
                WWWFinishCallback(url);
            }

            Desc = string.Format("{0}K", Www.bytes.Length / 1024f);
            OnFinish(Www);
        }

        // 预防WWW加载器永不反初始化, 造成内存泄露~
        if (Application.isEditor)
        {
            while (GetCount <CWWWLoader>() > 0)
            {
                yield return(null);
            }

            yield return(new WaitForSeconds(5f));

            while (Debug.isDebugBuild && !IsReadyDisposed)
            {
                CDebug.LogError("[CWWWLoader]Not Disposed Yet! : {0}", this.Url);
                yield return(null);
            }
        }
    }