Перейти к основному содержимому

Защита кода

Редакции Starter, Indie и Pro поставляют движок в виде скомпилированных DLL внутри .unitypackage, а не в виде исходного кода C#. В этих DLL я обфусцирую внутренние имена движка, поэтому пакет нельзя просто открыть и прочитать как исходный код. Редакции Source и Studio поставляются с исходным кодом C#, так что к ним ничего из этого не относится.

Эта страница объясняет, что это значит на практике: можно ли писать скрипты поверх движка, в безопасности ли ваши префабы и сцены и что намеренно оставлено читаемым.

Что вы получаете в каждой редакции​

РедакцияДвижок поставляется какПубличный APIXML-документацияОтладочные символы
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, чтобы проверить, что защита не мешает чистому импорту пакета, и сделал это дважды для каждой редакции.