问题描述
现在,看来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下载到硬盘中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!