Как скопировать файл из 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 шт):

Автор решения: vmchar

Скорее всего то, что вы задумали невозможно. Во-первых стоит отметить, что все, что входит в пакет приложения на андроид - находится внутри Jar - а это архив, так что для доступа придется разархивировать. Соответственно и путь будет не такой. Во-вторых, Resources - виртуальная папка и при сборке пакета приложения на любую платформу перестает существовать. Все ресурсы, находящиеся в Resources при компиляции проекта собираются в один большой бинарный файл, так что непосредственного доступа к ним не будет.

Можете попробовать реализовать вашу идею поместив нужные вам ресурсы в StreamingAssets, на эту тему найдется тред на форуме юнити.

→ Ссылка
Автор решения: Aleksey Timoshchenko

В итоге для андроида я сделал это таким образом

    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);
        }
    }
→ Ссылка