我正在使用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" );
}
}
答案 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。
它如何工作?
由于下载文件不是即时操作,因此必须使用协程,这样您就可以等待文件下载完毕。
如何使用代码下载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);
}
}
如何在代码中加载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
}
}
如何删除代码中的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
}
}
我希望此解决方案对您有用。