Scott Chamberlain solution das ist die richtigen und die empfohlen Weg, dies in Unity Aufruf zu tun, da WWW
API Threadingprobleme im Hintergrund verarbeitet. Sie müssen nur Coroutine verwenden, um es herunterzuladen, dann speichern Sie es mit manuell mit einer der File.WriteAllXXX
Funktionen wie Scott erwähnt.
Ich füge diese Antwort hinzu, da die Frage speziell nach WebClient
fragt und es gibt Zeiten, in denen WebClient
in Ordnung ist, wie große Daten.
Das Problem ist, dass Sie WebClient
geben. Sie müssen nicht WebClient
in einer Coroutine ergeben, wie Sie getan haben. Abonnieren Sie einfach das DownloadFileCompleted
Event, das auf einem anderen Thread aufgerufen wird. Um Unity-Funktion in dieser DownloadFileCompleted
Callback-Funktion zu nutzen, müssen Sie UnityThread
Skript von this Post verwenden und die Unity-Funktion mit Hilfe der UnityThread.executeInUpdate
Funktion ausführen ..
Hier ist ein komplettes Beispiel (UnityThread
ist erforderlich):
public Text text;
int fileID = 0;
void Awake()
{
UnityThread.initUnityThread();
}
void Start()
{
string url = "http://www.sample-videos.com/text/Sample-text-file-10kb.txt";
string savePath = Path.Combine(Application.dataPath, "file.txt");
downloadFile(url, savePath);
}
void downloadFile(string fileUrl, string savePath)
{
WebClient webClient = new WebClient();
webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(DoSomethingOnFinish);
webClient.QueryString.Add("fileName", fileID.ToString());
Uri uri = new Uri(fileUrl);
webClient.DownloadFileAsync(uri, savePath);
fileID++;
}
//THIS FUNCTION IS CALLED IN ANOTHER THREAD BY WebClient when download is complete
void DoSomethingOnFinish(object sender, AsyncCompletedEventArgs e)
{
string myFileNameID = ((System.Net.WebClient)(sender)).QueryString["fileName"];
Debug.Log("Done downloading file: " + myFileNameID);
//Ssafety use Unity's API in another Thread with the help of UnityThread
UnityThread.executeInUpdate(() =>
{
text.text = "Done downloading file: " + myFileNameID;
});
}
Vielen Dank für diese schnelle und sehr hilfreiche Antwort. Es hat sehr gut funktioniert. – Chloe
Gibt es eine Möglichkeit, den Download-Fortschritt zu sehen? – Chloe
Ja, wenn Sie sich die Dokumentation von WWW ansehen, sehen Sie das Feld ['progress'] (https://docs.unity3d.com/ScriptReference/WWW-progress.html). lies das, um zu sehen, wie weit der Fortschritt ist. –