Android Unity3d ограничение streamingAssetsPath only Метод запуска (обновленное устройство / версия или настройки?) - PullRequest
1 голос
/ 01 апреля 2019

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

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

ОРИГИНАЛЬНЫЙ ВОПРОС.Я знаю, что для чтения из streamingAssetsPath на Android мне нужно использовать UnityWebRequest Get from streamingAssetsPath и выдавать return unitywebrequest.SendWebRequest () в сопрограмме.Я также проверяю, является ли платформа Android, потому что на ПК мне не нужно использовать UnityWebRequest.Обычно я копирую файл json из streamingAssetsPath в persistentDataPath и работаю оттуда (поскольку я могу создавать и изменять файлы на ПК и Android / iOS на persistentDataPath).Моя проблема заключается в том, что чтение работает только на метод Start (или сопрограммы на метод Start).Я не знаю почему, но когда я пытаюсь прочитать файлы из 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

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

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

1 Ответ

1 голос
/ 01 апреля 2019

Я реализую аналогичный метод в своем приложении и могу читать из 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;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...