#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. В конце концов я решил принять ваш пост, по крайней мере, благодаря вашему ответу я знаю, что это не проблема с моим кодом.