Android Unity3d ограничение streamingAssetsPath только метод запуска (обновленное устройство / версия или настройки?)

#c# #android #unity3d

#c# #Android #unity3d

Вопрос:

РЕДАКТИРОВАТЬ 02 апреля 2019. С помощью Jambla я теперь почти уверен, что это не ограничение или ошибка UnityWebRequest, поскольку теперь я знаю, что тот же код, который я использую в своем проекте, работает для Jambla. Поскольку код в порядке, я думаю, что есть только два доступных решения: 1. Проблема заключается в сочетании версии Android / устройства. Я попробую на другом устройстве, как только смогу. 2. В настройках сборки моего проекта есть настройки, которые не позволяют моей игре копировать файлы из streamingAssetsPath после метода запуска (я могу подтвердить, что это не после запуска, потому что, если я попытаюсь включить gameobject после запуска, и этот объект получит скрипт, который попытается выполнить копирование в методе запуска, он все равно будет работать).

Если кто-нибудь знает, какой параметр отвечает за такое поведение, пожалуйста, ответьте на этот вопрос. Если вы испытываете такое же поведение на версии Android и / или устройстве, пожалуйста, сообщите мне, на каком устройстве / версии.

ОРИГИНАЛЬНЫЙ ВОПРОС. Я знаю, что для чтения из streamingAssetsPath на Android мне нужно использовать UnityWebRequest, полученный из streamingAssetsPath и возвращающий unitywebrequest.SendWebRequest() в сопрограмме. Я также проверяю, является ли платформа Android, потому что на ПК мне не нужно использовать UnityWebRequest. Обычно я копирую файл json из streamingAssetsPath в persistentDataPath и работаю оттуда (поскольку я могу создавать и изменять файлы на ПК и Android / iOS по persistentDataPath). Моя проблема в том, что чтение работает только для метода запуска (или сопрограммы для метода запуска). Я не знаю почему, но когда я пытаюсь прочитать файлы из streamingAssetsPath во время выполнения на Android (например, в обновлении или в методе, вызываемом с помощью кнопки) Я не могу этого сделать. Я хотел бы знать, является ли это ограничением Android / Unity или я могу его решить.

Мой код выглядит примерно так (этот код предназначен только для части Android):

 string fileUrlPath = Path.Combine(Application.streamingAssetsPath, "myjsonfile.json");
UnityWebRequest www = UnityWebRequest.Get(fileUrlPath);
yield return www.SendWebRequest(); //this is where the Coroutine fail if not on Start method
  

после этого я обычно использую файл.Напишите все байты, чтобы скопировать мой json в persistentDataPath.

Как только я узнаю, является ли это ограничением, я все равно смогу продолжить (я могу обойти это, скопировав файл в метод запуска в конце концов… Основная проблема заключалась в том, чтобы знать об этом), но если я могу это сделать, сделав что-то, чего я не знаю, я хотел бы знать, как это сделать.

Ответ №1:

Я реализую аналогичный метод в своем приложении, и я могу читать из streamingAssetsPath во время выполнения.

Вот моя реализация:

 private void LoadGameData()
{
    #if UNITY_EDITOR
    string filePath = Path.Combine (Application.streamingAssetsPath, gameDataFileName);

        if (File.Exists (filePath)) {
            string dataAsJson = File.ReadAllText (filePath);
            GameData loadedData = JsonUtility.FromJson<GameData> (dataAsJson);
            allRoundData = loadedData.allRoundData;
        } else 
        {
            Debug.LogError ("Cannot load game data!");
        }
    #elif UNITY_ANDROID
        string path = Application.streamingAssetsPath   "/data.json";
        WWW www = new WWW(path); 
        while(!www.isDone){}
        string dataAsJson1 = www.text;
        GameData loadedData1 = JsonUtility.FromJson<GameData> (dataAsJson1);
        allRoundData = loadedData1.allRoundData;
    #endif
}
  

Вот еще одна реализация, которая работает как на Android, так и в редакторе:

 private void LoadGameData()
{
    StartCoroutine(GetText());
}

IEnumerator GetText()
{
    string path = Application.streamingAssetsPath   "/data.json";
    UnityWebRequest www = UnityWebRequest.Get(path);
    yield return www.SendWebRequest();
    Debug.Log("Loaded Q's");
    string dataAsJson1 = www.downloadHandler.text;
    GameData loadedData1 = JsonUtility.FromJson<GameData>(dataAsJson1);
    allRoundData = loadedData1.allRoundData;

}
  

Комментарии:

1. спасибо, но вы должны отметить, что класс WWW устарел docs.unity3d.com/ScriptReference/WWW.html Я обратился к команде unity3d, и в будущем это будет удалено, поэтому обратите внимание. Тем не менее, возможно, это текущее ограничение класса UnityWebRequest, в конце концов, некоторую версию назад было невозможно сделать некоторые вещи, которые я могу сделать прямо сейчас (поэтому было невозможно использовать его вместо класса WWW).

2. В любом случае я попытаюсь спросить команду Unity3d, является ли это ошибкой / ограничением UnityWebRequest

3. Я обновил свой ответ рабочей версией, которая использует UnityWebRequest. Я протестировал это в редакторе и на Android, и это работает.

4. Я использовал тот же код (я пробовал комбинировать пути и строку string)… но на моем устройстве (xperia z5 compact Android версии 7.1.1) выход возвращает www.SendWebRequest (); работает, только если я вызываю GetText или LoadGameData в методе запуска. Если ваш код работает на Android, возможно, это ограничение устройства / версии Android, которое я использую … или что-то в сборке настроек. Я уверен, что это не тот код, поскольку я использую тот же код.

5. В конце концов я решил принять ваш пост, по крайней мере, благодаря вашему ответу я знаю, что это не проблема с моим кодом.