首页 文章

如何下载AssetBundle,然后将其保存在设备中

提问于
浏览
1

我正在使用LoadFromCacheOrDownload函数,我只是不确定如何从统一内部下载资产包,然后为设备中的本地加载资产包 . 谢谢!这是我目前使用的代码:

using UnityEngine.UI;
using System;


public class LoadScenes : MonoBehaviour
{
public string sceneAssetBundle;
public string sceneName;
public string sName;
public string bName;
public string BundleURL;
public int version;
public int downloaded = 0;


IEnumerator Start() {
    if (downloaded == 0){
        using (WWW www = WWW.LoadFromCacheOrDownload (BundleURL, version)) {
            yield return www;
            if (www.error != null)
                throw new Exception ("WWW download had an error:" + www.error);
            if (www.error == null) {
                AssetBundle bundle = www.assetBundle;
            }
        }
            if (Caching.ready == true) {
                downloaded = 1;
                yield return InitializeLevelAsync (sceneName, true);

            }
        }
    }


public void getScene(string sName){
    sceneName = sName;

}

public void getBundle(string bName){
    sceneAssetBundle = bName;

}


public IEnumerator InitializeLevelAsync (string levelName, bool isAdditive)
{
    // This is simply to get the elapsed time for this phase of AssetLoading.
    float startTime = Time.realtimeSinceStartup;

    // Load level from assetBundle.
    AssetBundleLoadOperation request = AssetBundleManager.LoadLevelAsync(sceneAssetBundle, levelName, isAdditive);
    if (request == null)
        yield break;
    yield return StartCoroutine(request);

    // Calculate and display the elapsed time.
    float elapsedTime = Time.realtimeSinceStartup - startTime;
    Debug.Log("Finished loading scene " + levelName + " in " + elapsedTime + " seconds" );
}
}

1 回答

  • 1

    您应该使用 PlayerPrefs 来了解何时下载资产,在尝试再次下载之前检查是否已下载资产 . 这是一个例子

    if (PlayerPrefs.GetInt("AssetLoaded", 0) == 0)
    {
        //Save that we have down loaded Asset 
        PlayerPrefs.SetInt("AssetLoaded", 1);
        Debug.Log("Asset has NOT been downloaded. Downloading....");
    
        //DOWNLOAD ASSET HERE
        //.......
    }
    else
    {
        Debug.Log("Asset already loaded. Can't download it again!");
    }
    

    要将其与您的问题中的代码结合使用:

    IEnumerator Start() {
        if (PlayerPrefs.GetInt("AssetLoaded", 0) == 0){
            Debug.Log("Asset has NOT been downloaded. Downloading....");
            using (WWW www = WWW.LoadFromCacheOrDownload (BundleURL, version)) {
                yield return www;
                if (www.error != null)
                    throw new Exception ("WWW download had an error:" + www.error);
                if (www.error == null) {
                    AssetBundle bundle = www.assetBundle;
                }
            }
                if (Caching.ready == true) {
                    downloaded = 1;
                    //Save that we have down loaded Asset 
                    PlayerPrefs.SetInt("AssetLoaded", 1);
                    yield return InitializeLevelAsync (sceneName, true);
    
                }
            }else
              {
                 Debug.Log("Asset already loaded. Can't download it again! Loading it instead");
                 yield return InitializeLevelAsync (sceneName, true);
              }
        }
    

    要重置它,只需调用 PlayerPrefs.DeleteKey("AssetLoaded"); .

相关问题