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

时间:2016-05-16 17:38:38

标签: c# unity3d assets assetbundle

我正在使用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" );
}
}

2 个答案:

答案 0 :(得分: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");

答案 1 :(得分:0)

我认为您不想使用LoadFromCacheOrDownload函数,因为显然它会将要下载的内容保存在高速缓存中,这是您不想要的东西,因为该内存只能加载而不可以通过代码删除。

对我来说,最好的解决方案是使用WebClient。

它如何工作?

  1. 您必须导入C#System.Net库(使用System.Net;)
  2. 由于下载文件不是即时操作,因此必须使用协程,这样您就可以等待文件下载完毕。

  3. 如何使用代码下载AssetBundle或任何文件

    using System.Collections;
    using UnityEngine;
    using System;
    using System.Net; //Most important Library
    
    public class DownloadClass: MonoBehaviour
    {
            //Your URL path
            string url = "https://yourUrl.com/fileName.extension";
    
            //Create a WebRequest instance
            Uri uri = new Uri(url);
    
            //Create a Client instance to download the WebRequest
            WebClient client = new WebClient();
    
            //Suscribe to the event ProgressChanged
            client.DownloadProgressChanged += Client_DownloadProgressChanged;
    
            //Create your coroutine to download your AssetBundle or any file (mp3, jpeg, etc)
            public IEnumerator DownLoadAsset()
            {
                    //Start download and specify the save path
                    client.DownloadFileAsync(uri, Application.persistentDataPath + "/yourPath/fileName");
    
                    while(client.IsBusy)   // Wait until the file download is complete
                            yield return null;
    
                    //Now your file is completely downloaded and saved
            }
    
            //Create your ProgressChanged "Listener"
            private void Client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
            {
                    //Show download progress
                    Debug.Log("Download Progress: " + e.ProgressPercentage);
            }
    
    }
    
  4. 如何在代码中加载AssetBundle或任何文件

    using System.Collections;
    using UnityEngine;
    using System;
    
    public class LoadClass : MonoBehaviour
    {
            //Variable to hold the asset bundle
            private AssetBundle bundle;
    
            public void LoadAsset()
            {
                    //Check to load the bundle only once
                    if (bundle != null)
                            bundle.Unload(true);
    
                    //Load an AssetBundle in a specific path
                    bundle = AssetBundle.LoadFromFile(Application.persistentDataPath + "/yourPath/fileName");
    
                    //Your file is Now loaded, you can access to your data              
            }
    }
    
  5. 如何删除代码中的AssetBundle或任何文件

    using System.Collections;
    using UnityEngine;
    using System;
    using System.IO;  //Most important Library
    
    public class DeleteClass : MonoBehaviour
    {
            public void DeleteAsset()
            {
                    //If the file exits, Delete the file
                    if (File.Exists(Application.persistentDataPath + "/yourPath/fileName"))
                            File.Delete(Application.persistentDataPath + "/yourPath/fileName");
    
                    //Your file was delete from memory
            }
    }
    

我希望此解决方案对您有用。