Как скопировать файл из Resorses в другую external dir (Unity Android)?
Мне нужно скопировать файл из \Assets\Resource в ..\Galaxy Note9\Phone\Android\data\com.app.unityandroidplayer\files (application system dir). Для того, чтоб это сделать я использую такой метод в C# скрипте
private IEnumerator CopyFile(string from, string to)
{
WWW www = new WWW(to);
yield return www;
File.WriteAllBytes(from, www.bytes);
}
вот так использую
string resFolder = Path.GetFullPath(Application.streamingAssetsPath);
string fromCopy = Path.GetFullPath(Path.Combine(resFolder, clipFile));
string toCopy = Application.persistentDataPath + "/copiedfile.co";
Debug.LogError($"Unity HERE path from copy :: {fromCopy}, to copy :: {toCopy}");
CopyFile(toCopy, fromCopy);
from : /jar:file:/data/app/com.app.unityandroidplayer-5TtI-XFqsA3fIeHPyaQ==/base.apk!/assets/3.co
to : /storage/emulated/0/Android/data/com.app.unityandroidplayer/files/copiedfile.co
При выполнение не получаю никаких ошибок, но и файл не копируется.
Вопрос: что делаю не так?
Ответы (2 шт):
Скорее всего то, что вы задумали невозможно. Во-первых стоит отметить, что все, что входит в пакет приложения на андроид - находится внутри Jar - а это архив, так что для доступа придется разархивировать. Соответственно и путь будет не такой. Во-вторых, Resources - виртуальная папка и при сборке пакета приложения на любую платформу перестает существовать. Все ресурсы, находящиеся в Resources при компиляции проекта собираются в один большой бинарный файл, так что непосредственного доступа к ним не будет.
Можете попробовать реализовать вашу идею поместив нужные вам ресурсы в StreamingAssets, на эту тему найдется тред на форуме юнити.
В итоге для андроида я сделал это таким образом
IEnumerator CopyFile(string from, string to)
{
using (var uwr = UnityWebRequest.Get(from))
{
yield return uwr.SendWebRequest();
if (uwr.isHttpError || uwr.isNetworkError)
{
Debug.LogError($"Unity Download error :: {uwr.responseCode} - {uwr.error}!", this);
yield break;
}
byte[] yourBytes = uwr.downloadHandler.data;
Debug.LogError($"Unity lenght of copied bytes :: {yourBytes.Length}");
File.WriteAllBytes(to, yourBytes);
}
}
и использование вот так
protected IEnumerator StartAndroid(string fileName)
{
string fromCopy = Path.Combine(Application.streamingAssetsPath, fileName);
string toCopy = Path.Combine(Application.persistentDataPath, fileName);
if (!File.Exists(toCopy))
{
Debug.LogError($"Unity path from copy :: {fromCopy}, to copy :: {toCopy}");
yield return CopyFile(fromCopy, toCopy);
}
}