Иногда a go Я написал Musi c Downloader и Player для Unity3D, используя WWW and байтовые массивы, которые работают без блокировки основного потока и используют FileInfo.
Класс создает WWW request для загрузки mp3 из публикуемых песен c string [] и когда WWW type (request.isDone) он будет File.WriteAllBytes в вашей локальной игре / пути приложения (и, увы, воспроизвести AudioClip). Мне интересно, можете ли вы модифицировать этот код, чтобы вы могли использовать свой c: \ tmp \ и каким-то образом получить * .jpeg, * .jpg, * .png и сохранить его по желанию и обновить свой прогресс без блокировки. Вам нужно будет использовать файл: // c: / tmp в строке пути:
request = new WWW(path);
Приведенный ниже код вместо jpg, jpeg и pngs сохраняет .mp3 (могут работать .au или .wav) в Application.persistentDataPath с помощью File.WriteAllBytes и в конечном итоге воспроизводится как audioClip. Поскольку он использует сопрограммы, нет блокировки основного потока, поэтому нет зависания для пользователя. Вам, конечно, потребуется модифицировать этот код, чтобы ваши изображения сохранялись в виде спрайтов или необработанных изображений. Я не уверен, будет ли он соответствовать вашим потребностям или может ли он работать, но если вы можете использовать любой из этого кода и использовать его, чтобы не блокировать основной поток в какой-либо степени, я буду рад.
Код ниже ~ 5 лет, поэтому приносим свои извинения, если некоторые классы могут быть устаревшими.
using UnityEngine;
using System.Collections;
using System.Net;
using System.IO;
public class PlayMusic : MonoBehaviour {
public string[] songs;
public string currentSong;
public float Size = 0.0f;
public int playMusic;
private int xRand;
private string temp;
WWW request;
byte[] fileData;
IEnumerator loadAndPlayAudioClip(string song) {
string path = song;
currentSong = song.Substring(song.LastIndexOf('/')+1);
temp = currentSong;
FileInfo info = new FileInfo(Application.persistentDataPath + "/" + song.Substring(song.LastIndexOf('/')+1));
if (info.Exists == true) {
print("file://"+Application.persistentDataPath + "/" + song.Substring(song.LastIndexOf('/')+1) + " exists");
path = "file:///" + Application.persistentDataPath + "/" + song.Substring(song.LastIndexOf('/')+1);
}
// Start a download of the given URL
request = new WWW(path);
yield return request;
#if UNITY_IPHONE || UNITY_ANDROID
AudioClip audioTrack = request.GetAudioClip(false, true);
audio.clip = audioTrack;
audio.Play();
#endif
}
void Start () {
xRand = Random.Range(0, 20);
if (playMusic)
StartCoroutine(loadAndPlayAudioClip(songs[xRand]));
}
// Update is called once per frame
void Update () {
if (playMusic) {
print("Size: "+Size +" bytes");
if (request.isDone) {
fileData = request.bytes;
Size = fileData.Length;
if (fileData.Length > 0) {
File.WriteAllBytes(Application.persistentDataPath + "/" + currentSong, fileData);
print("Saving mp3 to " + Application.persistentDataPath + "/" + currentSong);
}
}
}
}
}