Проект Unity, который я создаю, нацелен на iOS, Android и Windows X64.
Проблема
В одной из моих сцен я использую файл JSON для динамической загрузки некоторых спрайтов, находящихся в папке Resources, во время выполнения.Проблема, с которой я столкнулся на данный момент, заключается в следующем: когда я запускаю игру в редакторе Unity, она ведет себя как ожидалось (спрайты динамически загружаются и отображаются на сцене).Но когда я запускаю его на любой из трех платформ (на реальном оборудовании), спрайты не загружаются / не отображаются в сцене.Однако загружаются статические спрайты.
Настройка
Сцена является своего рода экраном выбора уровня.Для каждого уровня отображается спрайт.Спрайт и количество отображаемых спрайтов основаны на файле JSON, который читается при запуске сцены.Вот скриншот, чтобы дать вам лучшее впечатление:

В обратном вызове Start
одного из игровых объектов я запускаю код, чтобы прочитать JSONdata:
var sceneSelectionInfoList = JsonHelper.GetSceneSelectionInfoForLanguage(GameLanguage.German);
Класс JSONHelper (использует JSON.NET для ресурса Unity из хранилища активов):
using System.Collections.Generic;
using System.IO;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
public static class JsonHelper
{
private const string SceneDataIndexFilename = "Assets/Resources/SceneData/SceneDataIndex.json";
// Start is called before the first frame update
public static List<SceneSelectionInfo> GetSceneSelectionInfoForLanguage(GameLanguage language)
{
var sceneSelectionInfoList = new List<SceneSelectionInfo>();
// Open scene selection index
var sceneDataIndexEntries = GetSceneDataIndexEntries(SceneDataIndexFilename);
foreach (var sceneDataIndexEntry in sceneDataIndexEntries)
{
Logger.LogInfo(sceneDataIndexEntry.Filename);
using (var streamReader = new StreamReader(sceneDataIndexEntry.Filename))
{
var jsonData = streamReader.ReadToEnd();
var jObject = JObject.Parse(jsonData);
var id = jObject.SelectToken("id").ToString();
var basePath = jObject.SelectToken("basePath").ToString();
var sceneSelectionImage = basePath + jObject.SelectToken("dragAndDrop.sceneSelectionImage");
string title = null;
switch (language)
{
case GameLanguage.English:
title = jObject.SelectToken("titleEN").ToString();
break;
case GameLanguage.French:
title = jObject.SelectToken("titleFR").ToString();
break;
case GameLanguage.SwissGerman:
title = jObject.SelectToken("titleSG").ToString();
break;
case GameLanguage.Spanish:
title = jObject.SelectToken("titleES").ToString();
break;
case GameLanguage.German:
title = jObject.SelectToken("titleDE").ToString();
break;
case GameLanguage.Italian:
title = jObject.SelectToken("titleIT").ToString();
break;
}
var sceneSelectionInfo = new SceneSelectionInfo();
sceneSelectionInfo.SceneId = id;
sceneSelectionInfo.SceneSelectionImage = sceneSelectionImage;
sceneSelectionInfo.Title = title;
sceneSelectionInfoList.Add(sceneSelectionInfo);
}
}
return sceneSelectionInfoList;
}
private static List<SceneDataIndexEntry> GetSceneDataIndexEntries(string sceneDataIndexFilename)
{
using (var reader = new StreamReader(sceneDataIndexFilename))
{
var jsonData = reader.ReadToEnd();
Logger.LogInfo(jsonData);
return JsonConvert.DeserializeObject<List<SceneDataIndexEntry>>(jsonData);
}
}
}
Просто для полноты: класс SceneSelectionInfo
простоконтейнер данных (DTO), содержащий некоторые значения для передачи:
public class SceneSelectionInfo
{
public string SceneId;
public string SceneSelectionImage;
public string Title;
}
Вот пути к файлам и спрайтам JSON относительно папки проекта Unity:
SpriteПуть:
Assets/Resources/SceneData/AfternoonAtTheBeach/DragAndDrop/SceneSelection.png
Путь к файлу JSON:
Assets/Resources/SceneData/AfternoonAtTheBeach/SceneData.json
Вот фрагмент кода из файла JSON (basePath
и sceneSelectionImage
вместе создают путь к загружаемому спрайту):
{
"id": "AfternoonAtTheBeach",
"basePath": "SceneData/AfternoonAtTheBeach/",
"titleEN": "Afternoon at the beach",
"titleFR": "Après-midi sur la plage",
"titleSG": "Namitag am Strand",
"titleES": "Tarde en la playa",
"titleDE": "Nachmittag am Strand",
"titleIT": "Pomeriggio in spiaggia",
"dragAndDrop": {
"sceneSelectionImage": "DragAndDrop/SceneSelection",
"levels": [
{
"backgroundImage": "DragAndDrop/Graphics/Level1/Background",
"items": [
{
"image": "DragAndDrop/Graphics/Level1/Ball",
"dropPosX": -623,
Код для загрузки спрайтов (после прочтения пути из файла JSON):
var sprite = Resources.Load<Sprite>(sceneSelectionInfo.SceneSelectionImage);
swiperItem.GetComponent<SpriteRenderer>().sprite = sprite;
То, что я проверял до сих пор
- Я ссылаюсь на спрайты, используя относительные пути, начиная с каталога Assets / Resources, без расширений файлов (см. пример спрайтового пути выше).
- Я отключил кэширование библиотеки в Unity Cloud Build, чтобы избежать проблем со старыми артефактами сборки (поэтому каждый раз, когда я собираю, я делаю правильную, чистую сборку)
- Я могу локально собрать все три платформы (Unity сообщает об этом как "Успешная сборка")
- Я использую LoadSceneMode.Single (по умолчанию)
- Я использую ту же версию Unityлокально и в Unity Cloud Build: 2018.3.0f2
Спасибо за любые подсказки!