Как разобраться с кейсом: баг (или глупый разраб) при билде Unity игры на Android?
Сейчас ситуация такая: делаю свою первую игру на Unity. До конца её еще не сделал, решил протестить на android.
Сейчас ситуация такая: тестил и на реальном планшете, и на эмуляторе Android Studio. И там и там получается одна и та же ситуация. Судя по всему (логам), некоторые объекты со скриптами не создаются (или удаляются). Хз как это правильно назвать, но их нет, их скроипты не запускаются, при обращении к ним в логах пишет:
UnitDatabase.Instance is NULL!
Сейчас ситуация такая: попроверял создавать объект из кода других скриптов, но судя по логам, созданный скрипт, всё равно не выполняется.
Сейчас ситуация такая: ну и я так понимаю, что много объектов не создаётся, потому что я специально делал тестовый скрипт в отдельном объекте и в нескольких уже существующих, но он ни разу не вылез в логах:
using UnityEngine; public class TestLogger : MonoBehaviour { void Awake() { Debug.Log("TestLogger Awake"); } void Start() { Debug.Log("TestLogger Start"); } }
Из базы:
В Unity всё работает нормально.
По вводным: сцена одна. Она билдится.
По вводным: объекты действительно есть и они активны.
По вводным: компонент точно применен к объекту.
Заново объекты создавал.
По вводным: добавил этим объектам спрайты, в Unity они есть, на android уже нет.
Сейчас ситуация такая: в коде эти объекты нигде не удаляются.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Если в Unity на Android объекты со скриптами не создаются или
UnitDatabase.Instance is NULL, нужно смотреть не “Android вообще”, а порядок загрузки сцен, наличие объекта в build, инициализацию singleton и stripping. В редакторе Unity многое может работать случайно из-за порядка запуска, а на Android порядок и скорость отличаются.Проверьте первое: сцена с объектом
UnitDatabaseточно добавлена в Build Settings и загружается до тех скриптов, которые к нему обращаются. Частая ошибка — объект есть в тестовой сцене в редакторе, но в Android build стартует другая сцена.Singleton должен инициализироваться в
Awake():public class UnitDatabase : MonoBehaviour { public static UnitDatabase Instance { get; private set; } private void Awake() { if (Instance != null && Instance != this) { Destroy(gameObject); return; } Instance = this; DontDestroyOnLoad(gameObject); } }
Если другой скрипт обращается к
UnitDatabase.Instanceв своёмAwake(), порядок может быть неправильным. Перенесите обращение вStart()или настройте Script Execution Order.Для диагностики добавьте логи в
Awake,OnEnable,Startи смотрите logcat:adb logcat -s Unityadb logcat -s Unity
Если лог
TestLoggerне появляется вообще, значит объект не попал в сцену, выключен, удаляется до старта, сцена не та, или код не входит в сборку. Проверьте active state объекта и компонента, а также нет ли условий компиляции:#if UNITY_EDITOR // код только для редактора #endif
Ещё один вариант — Managed Stripping Level. Если объекты/типы создаются через reflection или строки, Android build может выкинуть часть кода. Для проверки временно поставьте stripping ниже или добавьте
link.xml.Итог: начните с Build Settings, порядка сцен и логов
Awake/Startчерез adb logcat. Потом проверьте singleton-порядок и stripping. Почти всегда причина в том, что объект с базой не существует в Android-сцене в момент обращения.