Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

Доступ и изменение параметров материала через скрипт

Все параметры Материала, которые вы видите в инспектореокне Unity, в котором отображается информация о выбранном в данный момент GameObject, настройки актива или проекта, что позволяет просматривать и редактировать значения. Дополнительная информация
See in Словарь
при просмотре материала доступны через сценарий, что дает вам возможность чтобы изменить или оживить работу материала во время выполнения.

Это позволяет изменять числовые значения Материала, менять цвета и динамически менять местами текстуры во время игры. Некоторые из наиболее часто используемых функций для этого:

Функции Name Use
SetColor Изменить цвет материала (например, цвет оттенка альбедо)
SetFloat Установите значение с плавающей запятой (например, множитель карты нормалей)
SetInt Установить целочисленное значение в материале
SetTexture Назначьте новую текстуру материалу

Полный набор функций, доступных для управления материалами с помощью скрипта, можно найти в справочнике по скриптам класса материалов.

Важно отметить, что эти функции устанавливают только те свойства, которые доступны для текущего шейдерапрограммы, которая выполняется на ГПУ. Подробнее
См. в Словарь
по материалу. Это означает, что если у вас есть шейдер, который не использует никаких текстур, или если у вас вообще нет привязки к шейдеру, вызов SetTexture не будет иметь никакого значения. эффект. Это верно, даже если вы позже установите шейдер, которому нужна текстура. По этой причине рекомендуется установить нужный шейдер перед настройкой каких-либо свойств, однако, как только вы это сделаете, вы сможете переключиться с одного шейдера на другой, который использует те же текстуры или свойства, и значения будут сохранены.

Эти функции работают, как и следовало ожидать, для всех простых шейдеров, таких как устаревшие шейдеры и встроенные шейдеры, отличные от стандартного шейдера (например, частиц, спрайтов, пользовательского интерфейса и неосвещенных шейдеров). Однако для материала, использующего Стандартный шейдер, существуют некоторые дополнительные требования, о которых вы должны знать, прежде чем сможете полностью изменить Материал.

Особые требования для сценариев со стандартным шейдером

Стандартный шейдер имеет некоторые дополнительные требования, если вы хотите изменять материалы во время выполнения, потому что за сценамисцена содержит среды и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
См. Словарь
— на самом деле это множество разных шейдеров, объединенных в один.

Эти различные типы шейдеров называются Варианты шейдераВерсия программа шейдера, которую Unity генерирует в соответствии с определенной комбинацией ключевых слов шейдера и их статусом. Объект Shader может содержать несколько вариантов шейдера. Подробнее
См. в Словарь
и можно рассматривать как все различные возможные комбинации функции шейдера, когда они активированы или не активированы.

Например, если вы решите назначить карту нормалейтип Текстура Bump Map, которая позволяет добавлять детали поверхности, такие как неровности, канавки и царапины, к модели, которые отражают свет, как если бы они были представлены реальной геометрией. Подробнее
Посмотрите в Словарь
к вашему материалу, вы активируете этот вариант шейдера, поддерживающего отображение нормалей. Если впоследствии вы также назначите карту высот, вы активируете вариант шейдера, который поддерживает сопоставление нормалей и карт высот.

Это хорошая система, потому что это означает, что если вы используете стандартный шейдер, но не используете карту нормалей в определенном материале, вы не несете затрат производительности на выполнение кода шейдера карты нормалей, потому что вы запуск варианта шейдера с опущенным кодом. Это также означает, что если вы никогда не используете определенную комбинацию функций (например, HeightMap и Emissive вместе), этот вариант полностью исключается из вашей сборки — и на практике вы, как правило, будете использовать только очень небольшое количество возможных вариантов стандартного шейдера. .

Unity избегает простого включения всех возможных вариантов шейдера в вашу сборку, потому что это будет очень большое количество, несколько десятков тысяч! Это большое число является результатом не только каждой возможной комбинации функций, доступных в инспекторе материалов, но также наличия вариантов каждой комбинации функций для разных классов рендерингаПроцесс отрисовки графики на экран (или текстуры рендеринга). По умолчанию основная камера в Unity отображает изображение на экране. Подробнее
Просмотрите в Словарь
сценарии, такие как HDRширокий динамический диапазон
См. Словарь
используется, < b>карты освещенияПредварительно визуализированная текстура, содержащая эффекты источников света на статических объектах сцены. Карты освещения накладываются поверх геометрии сцены для создания эффекта освещения. Подробнее
См. в Словарь
, GI, туман и т. д. Включение всего этого может вызвать медленная загрузка, высокое потребление памяти и увеличение размера сборки и времени сборки.

Вместо этого Unity отслеживает, какие варианты вы использовали, изучая материальные активы, используемые в вашем проекте. Какие бы варианты стандартного шейдера вы не включили в свой проект, именно эти варианты включены в сборку.

Это создает две отдельные проблемы при доступе к материалам через скрипт, использующий стандартный шейдер.

1. Вы должны включить правильные ключевые слова для требуемого стандартного варианта шейдера

Если вы используете сценарий для изменения Материала, который заставит его использовать другой вариант стандартного шейдера, вы должны включить этот вариант с помощью Функция EnableKeyword. Другой вариант потребуется, если вы начнете использовать функцию шейдера, которая изначально не использовалась материалом. Например, назначение карты нормалей материалу, у которого ее нет, или установка значения уровня эмиссии больше нуля, когда ранее он был равен нулю.

Конкретные ключевые слова, необходимые для включения функций стандартного шейдера, следующие:

Ключевые слова Функции
_NORMALMAP Normal Mapping
_ALPHATEST_ON Прозрачность "Вырезать" Режим рендерингаСтандартный шейдер Параметр материала, который позволяет вам выбрать, использует ли объект прозрачность, и если да, то какой тип режима наложения использовать. More info
See in Словарь
_ALPHABLEND_ON “Fade” Transparency Rendering Mode
_ALPHAPREMULTIPLY_ON “Transparent” Transparency Rendering Mode
_EMISSION Emission Colour or Emission Mapping
_PARALLAXMAP Height Mapping
_DETAIL_MULX2 Secondary “Detail” Maps (Albedo & Normal Map)
_METALLICGLOSSMAP Metallic/Smoothness Mapping in Metallic Workflow
_SPECGLOSSMAP Specular/Smoothness Mapping in Specular Workflow

Использования приведенных выше ключевых слов достаточно, чтобы ваши скриптовые модификации Материала работали во время работы в редакторе.

Однако, поскольку Unity проверяет только Материалы, используемые в вашем проекте, чтобы определить, какие варианты включить в вашу сборку, она не будет включать варианты, которые только встречаются с помощью скрипта во время выполнения.

Это означает, что если вы включите ключевое слово _PARALLAXMAP для материала в своем скрипте, но у вас нет материала, используемого в вашем проекте, соответствующего той же комбинации функций, сопоставление параллакса не будет работать в вашей окончательной сборке, даже если оно появится. работать в редакторе. Это связано с тем, что этот вариант будет исключен из сборки, потому что он не требуется.

2. Вы должны убедиться, что Unity включает в сборку необходимые варианты шейдеров

Для этого вам нужно убедиться, что Unity знает, что вы хотите использовать этот вариант шейдера, включив хотя бы один материал этого типа в свои активы. Материал должен использоваться в сцене или, в качестве альтернативы, помещен в вашу папку ресурсов — в противном случае Unity все равно исключит его из вашей сборки, поскольку он оказался неиспользованным. .

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

Если вам интересно узнать больше о вариантах шейдеров и о том, как написать свой собственный, прочитайте создание нескольких вариантов шейдеров здесь.

Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3