Защита кода
Редакции Starter, Indie и Pro поставляют движок в виде скомпилированных DLL внутри
.unitypackage, а не в виде исходного кода C#. В этих DLL я обфусцирую внутренние
имена движка, поэтому пакет нельзя просто открыть и прочитать как исходный код.
Редакции Source и Studio поставляются с исходным кодом C#, так что к ним ничего из этого не относится.
Эта страница объясняет, что это значит на практике: можно ли писать скрипты поверх движка, в безопасности ли ваши префабы и сцены и что намеренно оставлено читаемым.
Что вы получаете в каждой редакции
| Редакция | Движок поставляется как | Публичный API | XML-документация | Отладочные символы |
|---|---|---|---|---|
| Starter | Скомпилированные DLL | Закрыт | Нет | Нет |
| Indie | Скомпилированные DLL | Читаемый | Да | Нет |
| Pro | Скомпилированные DLL | Читаемый | Да | Нет |
| Source | Исходный код C# | Исходный код | Читайте в исходном коде | Не применимо |
| Studio | Исходный код C# | Исходный код | Читайте в исходном коде | Не применимо |
Indie и Pro: программируйте поверх движка как обычно
В Indie и Pro публичный API оставлен читаемым. Имена его типов и членов не переименовываются, а пакет содержит для него XML-документацию. В вашей IDE это означает автодополнение, подсказки по параметрам и всплывающие описания для каждого публичного члена — точно так же, как в любой другой библиотеке C#.
Всё, что не относится к публичному API, то есть внутренности движка, обфусцировано. Эти имена не нужны, чтобы сделать игру: публичная поверхность — поддерживаемый способ работать с движком. Что она охватывает, см. в разделе Публичный API.
Starter: API закрыт
Starter — редакция для ознакомления, поэтому её публичный API закрыт: имена обфусцированы, а XML-документации нет. Писать на C# поверх неё не предполагается.
Вы по-прежнему можете делать всё, что предлагают Inspector, Hub и графы визуального скриптинга, а компоненты и ассеты сохраняют обычные имена (следующий раздел), так что их можно добавлять в сцены и префабы и видеть в Inspector как обычно. Чтобы писать собственный код поверх движка, перейдите на Indie или выше. Редакции сравниваются в FAQ.
Что никогда не обфусцируется и почему
Два вида имён остаются нетронутыми в каждой редакции, потому что они нужны самому Unity:
- Имена классов, наследующих
UnityEngine.Object: компонентов (MonoBehaviour) и ассетов (ScriptableObject). - Имена сериализованных полей.
Unity ищет их по имени. Имена полей — это ключи, записанные в файлы ваших префабов и сцен, и именно их вы видите в Inspector. Если бы я их переименовал, данные, сохранённые в ваших префабах, перестали бы находить свои поля, и эти префабы сломались бы.
Поскольку имена компонентов, имена ассетов и имена сериализованных полей никогда не меняются, префабы и сцены, которые вы создаёте с помощью движка, обфускация не затрагивает.
Вывод честный и простой: эти имена видны, по тому что сам Unity должен уметь их читать. Это та часть движка, которая обязана оставаться читаемой, чтобы он вообще работал в вашем проекте.
Отладочных символов нет
Я открыл пакеты Starter, Indie и Pro, и ни в одном из них нет файлов символов
(.pdb или .mdb). В скомпилированной редакции нет ничего, что позволило бы отладчику пройти
по коду движка строка за строкой. Если вам нужно отлаживать внутри движка, для этого
и существуют редакции Source и Studio.
Импорт не затрагивается
Я импортировал каждую скомпилированную редакцию в новый проект Unity 6, чтобы проверить, что защита не мешает чистому импорту пакета, и сделал это дважды для каждой редакции.