Esempio n. 1
0
    // Where we actuall call WWW to download the assetBundle.
    protected bool LoadAssetBundleInternal(string assetBundleName, int level = 0)
    {
        // Already loaded.
        LoadedAssetBundle bundle = null;

        m_LoadedAssetBundles.TryGetValue(assetBundleName, out bundle);
        if (bundle != null)
        {
            bundle.m_ReferencedCount++;
            return(true);
        }

        // @TODO: Do we need to consider the referenced count of WWWs?
        // In the demo, we never have duplicate WWWs as we wait LoadAssetAsync()/LoadLevelAsync() to be finished before calling another LoadAssetAsync()/LoadLevelAsync().
        // But in the real case, users can call LoadAssetAsync()/LoadLevelAsync() several times then wait them to be finished which might have duplicate WWWs.
        if (m_DownloadingBundles.Contains(assetBundleName))
        {
            return(true);
        }

        VersionBundle vb = null;

        VersionHelper.instance.GetBundleHttp(assetBundleName, out vb);
        if (vb != null)
        {
            string id = vb.versionValue + "_" + vb.id;
            if (ResHelper.Instance().downloadedFiles.ContainsKey(id))
            {
                string url = PathUtils.MakeFilePath(id, PathUtils.PathType.MobileDiskWrite);
                AssetBundleCreateRequest abcr = AssetBundle.LoadFromFileAsync(url);
                m_InProgressOperations.Add(new AssetBundleDownloadFromFile(assetBundleName, abcr, url));
            }
            else
            {
                string url = GameConfig.HOST_RES() + vb.id + "?v=" + vb.versionValue;
                m_InProgressOperations.Add(new AssetBundleDownloadFromWebOperation(assetBundleName, url, vb.versionValue, vb.crc, level));
            }
        }
        else
        {
            PathUtils.PathType       eType = PathUtils.PathType.None;
            string                   url   = PathUtils.GetReadablePath(assetBundleName, ref eType, false);
            AssetBundleCreateRequest abcr  = AssetBundle.LoadFromFileAsync(url);
            m_InProgressOperations.Add(new AssetBundleDownloadFromFile(assetBundleName, abcr, url));
        }
        m_DownloadingBundles.Add(assetBundleName);

        return(false);
    }
Esempio n. 2
0
    /************************************
    * 函数说明: 获取本地可读资源路径
    * 返 回 值: string
    ************************************/
    public static string GetReadablePath(string fileName, ref PathUtils.PathType eType, bool addPre = true)
    {
        string szUrl = "";

        do
        {
            //if (!GameConfig.useLocalRes)
            {
                if (eType == PathUtils.PathType.None)
                {
                    switch (platform)
                    {
                    case RuntimePlatform.OSXEditor:
                    case RuntimePlatform.OSXPlayer:
                    case RuntimePlatform.WindowsPlayer:
                    case RuntimePlatform.WindowsEditor:
                        szUrl = PathUtils.MakeFilePath(fileName, PathUtils.PathType.MobileDiskWrite);
                        break;

                    case RuntimePlatform.Android:
                        szUrl = PathUtils.MakeFilePath(fileName, PathUtils.PathType.MobileDiskWrite);
                        break;

                    case RuntimePlatform.IPhonePlayer:
                        szUrl = PathUtils.MakeFilePath(fileName, PathUtils.PathType.MobileDiskWrite);
                        break;

                    default:
                        JZLog.LogError("GetBundle : Error For Platform");
                        break;
                    }

                    if (GameUtils.FileExist(szUrl) == true)
                    {
                        eType = PathUtils.PathType.MobileDiskWrite;
                        break;
                    }
                }
            }

            /** @brief: 默认手机盘只读数据 */
            if (eType == PathUtils.PathType.None)
            {
                switch (platform)
                {
                case RuntimePlatform.OSXEditor:
                case RuntimePlatform.OSXPlayer:
                case RuntimePlatform.WindowsPlayer:
                case RuntimePlatform.WindowsEditor:
                    szUrl = PathUtils.MakeFilePath(fileName, PathUtils.PathType.MobileDiskStreamAssert);
                    break;

                case RuntimePlatform.Android:
                    szUrl = dataPath + "!assets/" + fileName;
                    break;

                case RuntimePlatform.IPhonePlayer:
                    szUrl = PathUtils.MakeFilePath(fileName, PathUtils.PathType.MobileDiskStreamAssert);
                    break;

                default:
                    JZLog.LogError("GetBundle : Error For Platform");
                    break;
                }

                eType = PathUtils.PathType.MobileDiskStreamAssert;
            }
        } while (false);
        return(szUrl);
    }
Esempio n. 3
0
    /************************************
    * 函数说明: 内部加载资源
    * 返 回 值: System.Collections.IEnumerator
    * 参数说明: resRequest
    * 注意事项:
    ************************************/
    private IEnumerator LoadResources(string szPkgName, System.Action <string, AssetBundle> callback)
    {
        do
        {
            /** @brief: 检查参数 */
            if (string.IsNullOrEmpty(szPkgName))
            {
                //JZLog.LogError("AsyncLoadRes : Error szPkgName == null");
                yield break;
            }

            ResourceMgrData resourceData = null;
            /** @brief: 检查是否加载过此包 或者正在加载此包 */
            if (gDicPkgResource.ContainsKey(szPkgName) == false)
            {
                resourceData = new ResourceMgrData()
                {
                    eState      = ResourceMgrData.State.None,
                    assetBundle = null
                };
                gDicPkgResource[szPkgName] = resourceData;
            }
            else
            {
                resourceData = gDicPkgResource[szPkgName];
                if (resourceData.eState == ResourceMgrData.State.LoadFinish)
                {
                    if (null != callback)
                    {
                        callback(szPkgName, resourceData.assetBundle);
                        callback = null;
                    }
                    yield break;
                }
            }

            /** @brief: 避免一帧时间过长 */
            /** @brief: Non matching Profiler.EndSample (BeginSample and EndSample count must match) */
            /** @brief: One is catching an exception from another object, the other is long frame times. If it's either of those two, it can only be fixed by the Unity team. */
            // yield return new WaitForEndOfFrame();
            if (gDicPkgResource.ContainsKey(szPkgName) == false)
            {
                //JZLog.LogError("LoadResources : Warning Pkg == " + szPkgName + " Have no this Pkg , MayBe Remove it!");
                yield break;
            }

            if (resourceData.eState == ResourceMgrData.State.None)
            {
                resourceData.eState = ResourceMgrData.State.Loading;
            }
            else
            {
                break;
            }

            VersionBundle bundle = VersionHelper.instance.GetBundle(szPkgName);
            if (null != bundle && null != bundle.dependency && bundle.dependency.Length > 0)
            {
                for (int i = 0; i < bundle.dependency.Length; i++)
                {
                    string depName = bundle.dependency[i];
                    if (gDicPkgResource.ContainsKey(depName) == false || gDicPkgResource[depName].assetBundle == null)
                    {
                        yield return(GameWorld.instance.StartCoroutine(LoadResources(depName, null)));
                    }
                }
            }

            AssetBundle asset = null;
            if (VersionHelper.instance.HasBundleHttp(szPkgName))
            {
                VersionBundle httpAB = VersionHelper.instance.GetBundle(szPkgName);
                string        szUrl  = GameConfig.HOST_RES() + httpAB.id + "?v=" + httpAB.versionValue;
                WWW           www    = WWW.LoadFromCacheOrDownload(szUrl, httpAB.versionValue, httpAB.crc);
                yield return(www);

                if (null != www && null == www.error)
                {
                    asset = www.assetBundle;
                    www.Dispose();
                    www = null;
                }
                else
                {
                    JZLog.LogError("LoadResources : Load from www Error: " + szUrl + "\n" + www.error);
                }
            }
            else
            {
                PathUtils.PathType       eType = PathUtils.PathType.None;
                string                   szUrl = PathUtils.GetReadablePath(szPkgName, ref eType, false);
                AssetBundleCreateRequest abcr  = AssetBundle.LoadFromFileAsync(szUrl);
                yield return(abcr);

                if (null != abcr.assetBundle)
                {
                    asset = abcr.assetBundle;
                }
                else
                {
                    JZLog.LogError("LoadResources : Load from file Error: " + szUrl);
                }
            }

            if (null != asset)
            {
                if (resourceData.eState == ResourceMgrData.State.Loading)
                {
                    resourceData.assetBundle = asset;
#if UNITY_EDITOR
                    if ("shader_greymaterial.ab".Equals(szPkgName))
                    {
                        Material mat = gDicPkgResource[szPkgName].assetBundle.LoadAsset <Material>("GreyMaterial");
                        mat.shader = Shader.Find(mat.shader.name);
                    }
#endif
                }
            }
            else
            {
                resourceData.assetBundle = null;
            }

            /** @brief: 判断是否提前释放 */
            if (resourceData.eState == ResourceMgrData.State.Loading)
            {
                resourceData.eState = ResourceMgrData.State.LoadFinish;
            }
            else
            {
                if (IsInvalid(resourceData.assetBundle) == false)
                {
                    resourceData.assetBundle.Unload(true);
                    resourceData.assetBundle = null;
                }
            }
        } while (false);

        ResourceMgrData resourceMgrData = gDicPkgResource[szPkgName];
        /** @brief: 等待下载完成进行检测 */
        while (resourceMgrData.eState == ResourceMgrData.State.Loading)
        {
            yield return(new WaitForEndOfFrame());
        }

        /** @brief: 提前释放 */
        if (resourceMgrData.eState == ResourceMgrData.State.None)
        {
            callback = null;
            ////JZLog.LogWarning("LoadResources : You have Destroyed this bundle " + szPkgName + " , Ignore ...");
            yield break;
        }

        InitHideFlag(resourceMgrData.assetBundle);

        if (callback != null)
        {
            callback.Invoke(szPkgName, resourceMgrData.assetBundle);
            callback = null;
        }
    }