Искать на сайте Unity

Обновление сборки: быстрое определение используемого API

6 января 2015 г. через Технологии | 3 мин. читать
Placeholder image Unity 2
Placeholder image Unity 2
Охваченные темы
Поделиться

Is this article helpful for you?

Thank you for your feedback!

С введением Unity 5.0 мы пользуемся возможностью улучшить некоторые API. Конечно, мы хотим, чтобы процесс обновления был как можно менее болезненным, поэтому мы работаем над автоматическим обновлением API (как обсуждали с Лукасом) с поддержкой как скриптов, так и сборок, используемых в проектах. Есть два основных инструмента, AssemblyUpdater и ScriptUpdater, которые отвечают за применение актуального обновления API.

В случае скриптов определение использования измененного API, которое мы можем автоматически обновить, происходит путем проверки на присутствие определенной строки (UnityUpgradable) в сообщениях об ошибках компилятора, поэтому мы не можем никак повлиять на производительность в этом процессе.

В случае сборок первое, что мы делали, –просто сканировали сборки во время импорта, ища при этом измененные ссылки API. Для большинства разработчиков игр это хорошо работает (так как обычно они не делают импорт сборки в течение всего дня). Но оказалось, что это не оптимальное решение для, по крайней мере, группы разработчиков в Asset Store, которые создают сборки с использованием внешних инструментов (VS, Mono и т.д.) и импортируют их в Unity, чтобы проверить или для чего-то еще.

Для таких случаев мы вводим новый .Net-атрибут (UnityAPICompatibilityVersionAttribute), который может быть применен к сборкам, чтобы указать, что они используют только API, которые совместимы с определенной версией Unity. При запуске средства обновления сборки он проверяет сборку, обрабатываемую для этого атрибута и принимает сборку, не нуждающуюся в обновлении, если версия в атрибуте соответствует текущей версии Unity (Application.unityVersion).

С этими изменениями может быть добавлена следующая строка:

[csharp][assembly: UnityEngine.UnityAPICompatibilityVersion("1.2.3f1")] // in C# and Boo[/csharp]
[js]@assembly: UnityEngine.UnityAPICompatibilityVersion("1.2.3f1") // in UnityScript[/js]
Средство обновления не будет беспокоить при проверке сборки, содержащей этот код, когда она импортируется в Unity (если Unity имеет туже версию, т.е. 1.2.3f1)

Обратите внимание, что у нас нет понятия "обратной совместимости". Это означает, что если вы отметили свою сборку как совместимую с Unity API версии X + 1 и импортируете эту сборку в Unity версии X (конечно, при условии, что версия Unity имеет AssemblyUpdater , то есть, X >= 5.0), AssemblyUpdater будет сканировать сборку, ища кандидатов на обновление.

Еще одно преимущество такого подхода заключается в том, что сборки, которые обновляются автоматически, получат этот атрибут от средства обновления, так что, если по какой-либо причине, сборка снова импортируется (например, пользователь выбирает для ассетов "Reimport All"), обновления будут учитывать атрибут.

Пожалуйста, имейте в виду, что, хотя сейчас это реализовано так, мы рассматриваем другие варианты (например, начать контроль версий сборок UnityEngine), и, если мы решим использовать один из этих вариантов, мы можем изменить алгоритм принятия решения о том, следует ли искать устаревшие используемые API (мы могли бы проверить версию UnityEngine.dll, на которую ссылаются, чтобы сверить с нашей версией UnityEngine).

Не стесняйтесь спрашивать/комментировать.

@adrianoverona
6 января 2015 г. через Технологии | 3 мин. читать

Is this article helpful for you?

Thank you for your feedback!

Охваченные темы
Unity, логотипы Unity и другие торговые знаки Unity являются зарегистрированными торговыми знаками компании Unity Technologies или ее партнеров в США и других странах (подробнее здесь). Остальные наименования и бренды являются торговыми знаками соответствующих владельцев.