Иногда, в процессе разработки программного обеспечения Unity, мы принимаем решение о изменении и улучшении алгоритма работы классов, функций с свойств (API). Мы делаем это с акцентом на минимальном влиянии этих изменений на существующий пользовательский игровой код, но иногда, чтобы сделать что-то лучше, нам приходиться что-то нарушить.
Мы стараемся вводить такие крупные “ломающие что-либо” изменения только при переходе с одной значимой версии Unity к другой, и только в случаях, в которых это делает Unity более простой в использовании (пользователи столкнутся с меньшим количеством ошибок) или в случае значительного выигрыша в производительности и только полсле тщательного рассмотрения альтернатив. Однако, в результате этого, когда вы, например, открываете проект Unity 4 в Unity 5, вы можете обнаружить, что некоторые команды скриптов, которые вы использовали, изменились, исчезли или работают несколько иначе.
Один явный пример этого - это то, что в Unity 5 мы удалили “быстрый доступ”, который позволял вам прямо ссылаться на общие типы компонентов в GameObject, как например, gameObject.light
, gameObject.camera
, gameObject.audioSource
и т.д.
Теперь в Unity 5 вам нужно использовать команду GetComponent для всех типов, кроме Transform. Поэтому, если вы открыли проект Unity 4, который использует gameObject.light
в Unity 5, вы обнаружите, что определенные участки кода обозначены, как obsolete и должны быть обновлены.
Unity has an Automatic Obsolete API Updater which will detect uses of obsolete code in your scripts, and can offer to automatically update them. If you accept, it will rewrite your code using the updated version of the API.
Как всегда очевидно, важно делать резервную копию вашей работы на случай, если что-либо пойдет не так, особенно в случаях, когда вы разрешаете программному обеспечению переписывать ваш код! После того, как вы убедитесь, что сделали резервную копию и нажмете кнопку “Продолжить”, Unity перепишет все участки устаревшего кода в соответствии с рекомендуемой новой версией.
Так, например, если у вас есть скрипт, которые делает следующее:
light.color = Color.red;
Unity API updater преобразует это для вас, чтобы:
GetComponent<Light>().color = Color.red;
Общий процесс обновления следующий:
Таким образом, вы можете видеть, что обновление может запускаться множество раз, если есть скрипты, которые компилируются в разных проходах (скрипты на разных языках, скрипты редактора и т.д.), использующие устаревший код.
Когда обновление API успешно закончится, вы получите оповещение в консоли:
Если вы выбрали не разрешать API обновлению обновить ваши скрипты, вы увидите ошибки скриптов в консоли, что будет нормой. Вы также заметите, что ошибки, которые обновление API могло исправить автоматически, помечены (UnityUpgradable) в сообщении об ошибке.
Если в дополнение к устаревшему использованию API, ваши скрипты имеют другие ошибки, то обновление API будет не в состоянии закончить свою работу до исправления таких этих ошибок. В этом случае, вы будете оповещены об этом в окне консоли сообщением типа:
“Некоторые скрипты имеют ошибки компиляции, которые могут не позволить обновить устаревшее использование API. Обновление устаревшего API будет продолжено автоматически после того, как эти ошибки будет исправлены.”
После исправления других ошибок в вашем скрипте, вы сможете снова запустить обновление API. Обновление API будет запущено автоматически при компиляции скриптов, однако, вы можете запустить обновление и вручную из меню Assets, здесь:
When running Unity from the command line, you can use the -accept-apiupdate
option to cause the API Updater to run. See Command Line Arguments for more information.
Если вы получили сообщение “Ошибка обновления API. Проверьте предыдущие сообщения в консоли.” это значит, что обновление API столкнулось с проблемой, которая не позволила закончить его работу.
Обычная причина этого - это если обновление не смогло сохранить сделанные изменения, например, если пользователь не имеет прав на модификацию скрипта. Он может быть защищен от записи, например.
Просматривая предыдущие строки в консоли, в соответствии с инструкцией, вы сможете увидеть проблемы, возникшие в ходе процесса обновления.
The API updater cannot automatically fix every API change. Generally, API that is upgradable is marked with (UnityUpgradable)
in the obsolete message. For example:
[Obsolete("Foo property has been deprecated. Please use Bar (UnityUpgradable)")]
The API updater only handles APIs marked as (UnityUpgradable)
.
The API updater might not run if the only updatable API in your scripts include component or GameObject common properties, and those scripts only access members of those properties. Examples of common properties are renderer
and rigidbody
, and example members of those properties are rigidbody.mass
and renderer.bounds
. To workaround this, add a dummy method to any of your scripts to trigger the API updater. For example:
private object Dummy(GameObject o) { return o.rigidbody;}.