Иногда при разработке программного обеспечения Unity мы принимаем решение изменить и улучшить способ работы классов, функций и свойств (API). Мы делаем это, чтобы оказать минимальное влияние на существующий игровой код пользователя, но иногда, чтобы улучшить ситуацию, нам приходится что-то ломать.
Мы склонны вносить эти существенные «критические изменения» только при переходе от одной значимой версии Unity к другой и только в тех случаях, когда это упрощает использование Unity (то есть пользователи будут совершать меньше ошибок) или дает ощутимый прирост производительности. и только после тщательного альтернативного рассмотрения. Однако результатом этого является то, что если вы, например, откроете проект Unity 4 в Unity 5, вы можете обнаружить, что некоторые команды сценариев, которые вы использовали, теперь были изменены, удалены или работают немного по-другому.
Очевидным примером этого является то, что в Unity 5 мы удалили «быстрые методы доступа», которые позволяли вам ссылаться на распространенные типы компонентов в классе GameObjectОсновной объект в сценах Unity, который может представлять персонажей, реквизит, декорации, камеры, путевые точки и многое другое. Функциональность GameObject определяется прикрепленными к нему компонентами. Подробнее
См. непосредственно в Словарь, например gameObject .light
, gameObject.camera
, gameObject.audioSource
и т. д.
В Unity 5 теперь нужно использовать команду GetComponent для всех типов, кроме преобразования. Поэтому, если вы откроете проект Unity 4, который использует gameObject.light
в Unity 5, вы обнаружите, что конкретная строка кода устарела и должна быть обновлено.
Автоматическое обновление
В Unity есть программа обновления API, которая обнаруживает использование устаревшего кода в ваших скриптахЧасть кода, который позволяет вам создавать свои собственные Компоненты, запускать игровые события, изменять свойства Компонентов с течением времени и реагировать на ввод данных пользователем любым удобным для вас способом. Подробнее
Смотрите в Словарь и можете предложить их автоматическое обновление. Если вы согласитесь, он перепишет ваш код, используя обновленную версию API.
Очевидно, что, как всегда, важно иметь резервную копию вашей работы на случай, если что-то пойдет не так, особенно когда вы позволяете программному обеспечению переписывать ваш код! Как только вы убедитесь, что у вас есть резервная копия, и нажмете кнопку «Вперед», Unity перезапишет все экземпляры устаревшего кода рекомендуемой обновленной версией.
Например, у вас был скрипт, который делал следующее:
light.color = Color.red;
Обновление API Unity преобразует это для вас в:
GetComponent().color = Color.red;
Общий рабочий процесс программы обновления выглядит следующим образом:
Открыть проект/импортировать пакет, содержащий скрипты/сборки с устаревшим использованием API
Unity запускает компиляцию скрипта
Средство обновления API проверяет наличие определенных ошибок компилятора, которые, как ему известно, являются "обновляемыми"
Если на предыдущем шаге обнаружено какое-либо событие, покажите пользователю диалоговое окно с предложением автоматического обновления, в противном случае мы закончили.
Если пользователь принимает обновление, запустите средство обновления API (которое обновит все скрипты, написанные на том же языке, который был скомпилирован на шаге 2)
Переходите к шагу 2 (чтобы принять во внимание обновленный код), пока на шаге 5 не будут обновлены скрипты.
Итак, из приведенного выше списка видно, что программа обновления может запускаться несколько раз, если есть скрипты, попадающие в разные этапы компиляции (например, скрипты на разных языках, скрипты редактора и т. д.), использующие устаревший код.
После успешного завершения работы средства обновления API в консоли отображается следующее уведомление:
Если вы выберете не, чтобы разрешить программе обновления API обновлять ваши скрипты, вы увидите ошибки скриптов в своей консоли, как обычно. Вы также заметите, что ошибки, которые средство обновления API может обновлять автоматически, помечены как (UnityUpgradable) в сообщении об ошибке.
Если в вашем скрипте есть другие ошибки, помимо использования устаревшего API, программа обновления API не сможет полностью завершить свою работу, пока вы не исправите другие ошибки. В этом случае вы будете уведомлены в окне консолиокне редактора Unity, в котором отображаются ошибки, предупреждения и другие сообщения, созданные Unity или ваши собственные скрипты. Подробнее
См. в Словарь с таким сообщением:
«Некоторые скрипты имеют ошибки компиляции, которые могут помешать обновлению устаревших API. Обновление устаревшего API продолжится автоматически после исправления этих ошибок».
После того как вы исправите другие ошибки в своем скрипте, вы можете снова запустить средство обновления API. Средство обновления API запускается автоматически при запуске компиляции скрипта, но вы также можете запустить его вручную из меню «Активы» здесь:
Режим командной строки
При запуске Unity в пакетном режиме из командной строки используйте параметр -accept-apiupdate
, чтобы разрешить запуск средства обновления API. Дополнительные сведения см. в разделе Аргументы командной строки.
Ведение журнала
управление версиямиСистема управления изменениями файлов. Вы можете использовать Unity в сочетании с наиболее распространенными инструментами контроля версий, включая Perforce, Git, Mercurial и PlasticSCM. Подробнее
Система See in Словарь позволяет увидеть, какие изменения APIUpdater применяет к сценариям проекта. . Однако это может быть сложно при работе с предварительно скомпилированными сборками. Чтобы просмотреть список изменений, сделанных AssemblyUpdater (компонент APIUpdater, отвечающий за обновление сборок), задайте для переменной среды UNITY_ASSEMBLYUPDATE_LOGTHRESHOLD
желаемое пороговое значение журнала и запустите Unity. Например, в Windows вы можете ввести:
c:> set UNITY_ASSEMBLYUPDATE_LOGTHRESHOLD=Debug
c:> \path\to\unity\Unity.exe
После завершения AssemblyUpdater вы можете увидеть примененные обновления в Editor.log:
[AssemblyUpdater] Property access to 'UnityEngine.Rigidbody
UnityEngine.GameObject::get_rigidbody()' in 'System.Void
Test.ClassReferencingObsoleteUnityAPIThroughEditorAssembly::Run()' replaced with 'T
UnityEngine.GameObject::GetComponent<UnityEngine.Rigidbody>()'.
Действительные значения для переменной среды UNITY_ASSEMBLYUPDATE_LOGTHRESHOLD
в порядке возрастания детализации:
Error: AssemblyUpdater регистрирует только сообщения Error. Сообщения об ошибках заносятся в журнал, когда AssemblyUpdater не может применить конкретное обновление, что требует от вас принятия корректирующих действий (обычно запрашивается у исходного автора сборки предоставление обновленной версии сборки).
Warning. AssemblyUpdater регистрирует только сообщения Warning и Error. Предупреждающие сообщения обычно указывают на то, что AssemblyUpdater достиг состояния, в котором может возникнуть потенциальная проблема. Эти проблемы могут зависеть от условий, неизвестных программе AssemblyUpdater на момент регистрации сообщения.
Info. AssemblyUpdater регистрирует только Info, Warning и Error. Информационные сообщения содержат обновления, примененные AssemblyUpdater.
Debug. AssemblyUpdater регистрирует все сообщения. Отладка помощь в устранении неполадок. Вы можете установить порог на этот уровень, если у вас возникли проблемы с AssemblyUpdater и вы хотите сообщить о них в Unity.
Error — это значение по умолчанию, если UNITY_ASSEMBLYUPDATE_LOGTHRESHOLD
не установлен.
Устранение неполадок
Если вы получили сообщение «Ошибка обновления API. Проверьте предыдущие сообщения консоли». это означает, что программа обновления API столкнулась с проблемой, из-за которой она не может завершить свою работу.
Частой причиной этого является то, что программе обновления не удалось сохранить свои изменения. Например, у пользователя может не быть прав на изменение обновленного сценария, поскольку он защищен от записи.
Проверив предыдущие строки в консоли в соответствии с инструкциями, вы сможете увидеть проблемы, возникшие в процессе обновления.
Ограничения
Программа обновления API не может автоматически исправлять каждое изменение API. Как правило, обновляемый API помечен как (UnityUpgradable)
в сообщении об устаревшем. Например:
[Obsolete("Foo property has been deprecated. Please use Bar (UnityUpgradable)")]
Программа обновления API обрабатывает только API, помеченные как (UnityUpgradable)
.
Программа обновления API может не запуститься, если единственный обновляемый API в ваших сценариях включает в себя общие свойства компонента или GameObject, а эти сценарии имеют доступ только к членам этих свойств. Примерами общих свойств являются renderer
и rigidbody
, а примерами членов этих свойств являются rigidbody. mass
и renderer.bounds
. Чтобы обойти это, добавьте фиктивный метод в любой из ваших сценариев, чтобы активировать средство обновления API. Например:
private object Dummy(GameObject o) { return o.rigidbody;}.