将AssetBundle下载到硬盘中 [英] Download AssetBundle in hard disk
问题描述
现在,看来UnityWebRequest.GetAssetBundle
将资产下载到RAM并加载.反正有下载到硬盘来加载吗?
Right now, it seems UnityWebRequest.GetAssetBundle
download asset to RAM and load. Is there anyway to download to hard disk to load?
推荐答案
这并不复杂.像处理普通文件一样处理该文件,您可以从Internet下载该文件,但使用.unity3d" 扩展名保存.
This is not really complicated. Handle it like a normal file you would download from the internet but save it with the ".unity3d" extension.
1 .通过向UnityWebRequest
发出请求,将AssetBundle
下载为普通文件.
1.Download the AssetBundle
as a normal file by making a request with UnityWebRequest
.
UnityWebRequest www = UnityWebRequest.Get(url);
yield return www.Send();
2 .使用DownloadHandler.data
检索字节数组数据,然后将其保存到Application.persistentDataPath/yourfolder/filename.unity3d
.确保扩展名为.unity3d" .
2.Retrieve the byte array data with DownloadHandler.data
then save it to Application.persistentDataPath/yourfolder/filename.unity3d
. Make sure that the extension is ".unity3d".
File.WriteAllBytes(handle.data, data);
就是这样.
3 .要加载数据,请使用AssetBundle.LoadFromFile
或AssetBundle.LoadFromFileAsync
:
3.To load the data, use AssetBundle.LoadFromFile
or AssetBundle.LoadFromFileAsync
:
AssetBundleCreateRequest bundle = AssetBundle.LoadFromFileAsync(path);
如果仍然感到困惑,这应该是下面的样子.您可能需要进行一些修改:
If still confused, here is what the thing should look like. You may need to make some modification:
下载并保存:
IEnumerator downloadAsset()
{
string url = "http://url.net/YourAsset.unity3d";
UnityWebRequest www = UnityWebRequest.Get(url);
DownloadHandler handle = www.downloadHandler;
//Send Request and wait
yield return www.Send();
if (www.isError)
{
UnityEngine.Debug.Log("Error while Downloading Data: " + www.error);
}
else
{
UnityEngine.Debug.Log("Success");
//handle.data
//Construct path to save it
string dataFileName = "WaterVehicles";
string tempPath = Path.Combine(Application.persistentDataPath, "AssetData");
tempPath = Path.Combine(tempPath, dataFileName + ".unity3d");
//Save
save(handle.data, tempPath);
}
}
void save(byte[] data, string path)
{
//Create the Directory if it does not exist
if (!Directory.Exists(Path.GetDirectoryName(path)))
{
Directory.CreateDirectory(Path.GetDirectoryName(path));
}
try
{
File.WriteAllBytes(path, data);
Debug.Log("Saved Data to: " + path.Replace("/", "\\"));
}
catch (Exception e)
{
Debug.LogWarning("Failed To Save Data to: " + path.Replace("/", "\\"));
Debug.LogWarning("Error: " + e.Message);
}
}
加载:
IEnumerable LoadObject(string path)
{
AssetBundleCreateRequest bundle = AssetBundle.LoadFromFileAsync(path);
yield return bundle;
AssetBundle myLoadedAssetBundle = bundle.assetBundle;
if (myLoadedAssetBundle == null)
{
Debug.Log("Failed to load AssetBundle!");
yield break;
}
AssetBundleRequest request = myLoadedAssetBundle.LoadAssetAsync<GameObject>("boat");
yield return request;
GameObject obj = request.asset as GameObject;
obj.transform.position = new Vector3(0.08f, -2.345f, 297.54f);
obj.transform.Rotate(350.41f, 400f, 20f);
obj.transform.localScale = new Vector3(1.0518f, 0.998f, 1.1793f);
Instantiate(obj);
myLoadedAssetBundle.Unload(false);
}
这篇关于将AssetBundle下载到硬盘中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!