Детерминизм скрипта редактора
Скрипты, изменяющие ресурсы во время импорта или последующей обработки, могут непреднамеренно нарушить детерминизм сборки. Перед сборкой убедитесь, что все генерируемые ресурсы имеют стабильную версию.
Чтобы предотвратить недетерминированные сборки скриптов Unity Editor, следуйте следующим рекомендациям:
- Сортируйте собранные ассеты детерминистически по GUID или пути ассета перед назначением их в сериальные поля.
Directory.GetFilesиAssetDatabase.FindAssetsне гарантируют сортировки результатов.- Не удаляйте и не импортируйте ресурсы до сборки, так как Unity создает новый GUIDs для импортированных ресурсов.
Избегайте недетерминистских шаблонов кодирования, таких как следующие:
- Скрипты постпроцессора, которые отмечают ассеты как грязные и повторно сохраняют их во время импорта.
- AssetPostprocessor скрипты, которые используют случайные семена или пути для конкретной машины.
- Случайные или временные значения (
Random.value,Guid.NewGuid,DateTime.Now, выборка шума) при генерации ассетов. - Создание новых ScriptableObject ассетов во время сборки, которые генерируют различные GUIDs на машине.
- Изменение серийных данных ассета во время процесса построения, поскольку изменения трудно обнаружить.
Детерминизм предсериализованных данных
В некоторых рабочих потоках инструменты генерируют предварительно серийные данные времени выполнения, такие как двоичные сообщения Protobuf, JSON blobs или другие двоичные полезные нагрузки во время процесса сборки, и встраивают их в сборку в качестве ассетов или ресурсов.
Даже если генерируемый код является детерминированным, данные, серийизованные таким образом, могут быть не такими. Просмотрите официальную документацию или исходный код библиотеки серийизации, чтобы убедиться, что она производит детерминированный выход при идентичных входах.
Избегайте повторного создания серийных данных во время каждой сборки. Вместо этого создавайте данные один раз, проверяйте их и фиксируйте в системе управления версиями.