Почему я не могу найти файлы шрифтов (.ttf) в игре Unity android в persistentDataPath? - PullRequest
0 голосов
/ 02 марта 2020

Может кто-нибудь направить меня в правильном направлении? Моя игра android, которую я сделал на Unity 2018.4.9 с использованием C# на VS 2017, не может обнаружить файлы с постоянным путем к данным.

Два файла шрифтов находятся в каталоге постоянных путей данных. This is a screenshot of app persistent data folder.

Это мой код, который находит два файла шрифтов.

    string fontpath1 = Application.streamingAssetsPath + "/LEOPALMHINDI15K710.TTF";
    string fontpath2 = Application.streamingAssetsPath + "/LEOPALMHINDI14K240.TTF";
    //Check Font 1 existence
    if (File.Exists(fontpath1))
    {
        Debugtext.text += "true1\r\n";
    }
    else if (!File.Exists(fontpath1))
    {

        Debugtext.text += "false1\r\n";


    }

    //Check Font 2 existence
    if (File.Exists(fontpath2))
    {
        Debugtext.text += "true2\r\n";
    }
    else if (!File.Exists(fontpath2))
    {

        Debugtext.text += "false2\r\n";


    }
    //Third File(Image file existence)
    if (File.Exists(Application.persistentDataPath + "/FullShot.jpg"))
    {
        Debugtext.text += "trueIM\r\n";
    }
    else if (!File.Exists(Application.persistentDataPath + "/FullShot.jpg"))
    {

        Debugtext.text += "falseIM\r\n";


    }
    Debugtext.text += Application.persistentDataPath;

Debugtext.text - это текстовое поле, в котором показан результат трех файлов: a) Файл шрифта 1 b) Файл шрифта 2 c) Файл изображения

Трассировки отладки для файлов 1 и 2 всегда ложны, тогда как файл изображения возвращает true, когда он присутствует.

Эти файлы шрифтов загружаются с использованием UnityWebRequest от потокового пути к постоянному пути, используя следующий код:

    string fontpath1 = Application.streamingAssetsPath + "/LEOPALMHINDI15K710.TTF";
    string fontpath2 = Application.streamingAssetsPath + "/LEOPALMHINDI14K240.TTF";

    //Request Font1

    UnityWebRequest request = UnityWebRequest.Get(fontpath1);
    request.SendWebRequest();
    while (!request.isDone)
    {


    }
    System.IO.File.WriteAllBytes(Application.persistentDataPath + "/LEOPALMHINDI15K710.TTF", request.downloadHandler.data);

    //Request Font2

    UnityWebRequest font2 = UnityWebRequest.Get(fontpath2);
    font2.SendWebRequest();
    while (!font2.isDone)
    {


    }
    System.IO.File.WriteAllBytes(Application.persistentDataPath + "/LEOPALMHINDI14K240.TTF", font2.downloadHandler.data);

Файлы загружаются и правильно записываются в постоянный путь данных, который является хранилищем / эмулируется / 0 / Android / data / com.appname.com / files (перепроверено в следах.)

Почему эти два файла шрифтов не находятся и не возвращают false, в то время как другие файлы по тому же пути возвращают true?

Пожалуйста, кто-нибудь, помогите мне исправить Это. Я должен найти эти два файла шрифтов.

1 Ответ

1 голос
/ 02 марта 2020

В общем:

Всегда используйте Path.Combine вместо жестких кодов системных путей через конкатенацию строк + "/"! Path.Combine скорее использует правильные разделители пути в соответствии с работающей ОС

string fontpath1 = Path.Combine(Application.streamingAssetsPath, "LEOPALMHINDI15K710.TTF");
string fontpath2 = Path.Combine(Application.streamingAssetsPath, "LEOPALMHINDI14K240.TTF");

Затем обратите внимание, что вы проверяете наличие шрифтов в streamingAssetsPath, в то время как для изображение, которое вы проверяете в persitentDataPath ...

Итак, чтобы ответить на вопрос

Почему эти два файла шрифтов не находятся и не возвращают false, в то время как другие файлы по тому же пути возвращают true?

Вы не смотрите по тому же пути!

Вы, вероятно, хотели проверить наличие шрифтов также в persitentDataPath.

Afaik direct System.IO не работает для streamingAssetsPath на Android, так как он упакован. Вот почему вы используете UnityWebRequest для их чтения. Так что для streamingAssetsPath эти проверки, вероятно, всегда будут false.

...