Как изменить материал объекта unity скриптом
Перейти к содержимому

Как изменить материал объекта unity скриптом

  • автор:

Using materials with C# scripts

All the parameters of a material asset that you see in the Inspector A Unity window that displays information about the currently selected GameObject, asset or project settings, allowing you to inspect and edit the values. More info
See in Glossary window are accessible via script, giving you the power to change or animate how a material works at runtime.

This allows you to modify numeric values on the material, change colours, and swap textures dynamically during gameplay. Some of the most commonly used methods to do this are:

Method Name Use
SetColor Change the color of a material (Eg. the albedo tint color)
SetFloat Set a floating point value (Eg. the normal map multiplier)
SetInteger Set an integer value in the material
SetTexture Assign a new texture to the material

The full set of methods available for manipulating materials via script can be found on the Material class scripting reference.

One important note is that these methods only set properties that are available for the current Shader A program that runs on the GPU. More info
See in Glossary object
on the material. This means that if you have a shader that doesn’t use any textures, or if you have no shader bound at all, calling SetTexture will have no effect. This is true even if you later set a shader that needs the texture. For this reason it is recommended to set the shader you want before setting any properties. However, after you have set the shader you can switch from one shader to another that use the same textures or properties and values will be preserved.

These methods work as you would expect for all simple shaders such as the legacy shaders, and the built-in shaders other than the Standard Shader (for example, the particle, sprite, UI and unlit shaders). For a material using the Standard Shader however, there are some further requirements which you must be aware of before being able to fully modify the material.

Как изменить материал объекта unity скриптом

VitaliyCh 08 сен 2011, 12:16

Re: Как сменить материал объекта?

Neodrop 08 сен 2011, 12:18

Изображение
«Спасибо!» нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.

  • Сайт

Re: Как сменить материал объекта?

VitaliyCh 08 сен 2011, 12:34

В каком уроке можно посмотреть тему по сабжу?

Re: Как сменить материал объекта?

VitaliyCh 08 сен 2011, 12:42

В комментарии к разделу указано: Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.
Хотя в справке я не нашел как это сделать.

Re: Как сменить материал объекта?

Order 08 сен 2011, 12:44

, _juc4you@mail.ru ;
Платные консультации, программирование ваших проектов Unity3d,C#,IOS,Android.

Re: Как сменить материал объекта?

VitaliyCh 08 сен 2011, 13:04

В том и вопрос, как собственно поменять материал. Сделал по вашей рекомендации завел несколько паблик переменных, назначил на них разные материалы попробовал поменять таким образом:
GameObject.renderer.material = GameObject.GetComponent<Script>().newMaterial;

Re: Как сменить материал объекта?

IDoNotExist 08 сен 2011, 13:23

VitaliyCh писал(а): В том и вопрос, как собственно поменять материал. Сделал по вашей рекомендации завел несколько паблик переменных, назначил на них разные материалы попробовал поменять таким образом:
GameObject.renderer.material = GameObject.GetComponent<Script>().newMaterial;

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

Вообще адекватно это делается както так:

using UnityEngine ;
using System.Collections ;

public class ChangeMaterial : MonoBehaviour {

public Material [ ] materialArray ;

public int pointer = 0 ;

void Update ( ) {
if ( pointer >= materialArray. Length ( ) ) {
Debug. Log ( "Error. Watch for fucking pointer. " ) ;
pointer = 0 ;
} else {

gameObject . renderer . material = materialArray [ pointer ] ;

Re: Как сменить материал объекта?

Order 08 сен 2011, 13:36

material1 = material2;
думаю должно работать.

Еще лучше делать через массив как показали. если много материалов.

, _juc4you@mail.ru ;
Платные консультации, программирование ваших проектов Unity3d,C#,IOS,Android.

Re: Как сменить материал объекта?

VitaliyCh 08 сен 2011, 13:53

VitaliyCh писал(а): В том и вопрос, как собственно поменять материал. Сделал по вашей рекомендации завел несколько паблик переменных, назначил на них разные материалы попробовал поменять таким образом:
GameObject.renderer.material = GameObject.GetComponent<Script>().newMaterial;

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

Вообще адекватно это делается както так:

using UnityEngine ;
using System.Collections ;

public class ChangeMaterial : MonoBehaviour {

public Material [ ] materialArray ;

public int pointer = 0 ;

void Update ( ) {
if ( pointer >= materialArray. Length ( ) ) {
Debug. Log ( "Error. Watch for fucking pointer. " ) ;
pointer = 0 ;
} else {

gameObject . renderer . material = materialArray [ pointer ] ;

Не понимаю, что смешного вы нашли в моем вопросе.
gameObject.renderer.material = materialArray[pointer]; — в этой строке вы меняете метериал
GameObject.renderer.material = GameObject.GetComponent<Script>().newMaterial; — я делал то же самое, только беру материал не из массива и из паблик переменной другого скрипта и данная конструкция не работала.
А вот: GameObject.renderer.sharedMaterial = newMaterial; сменила материал. Соответственно интересно чем отличается переменная sharedMaterial от material?

Re: Как сменить материал объекта?

Guyver 08 сен 2011, 14:33

это я ответ даю самым маленьким . гугл итить его в душу .

ответы даны в 1х ссылках поиска

ответы как вы заметили из мануала юнити .

я знаю сикрет! .. у меня прем акаунт в гугле, и он мне даёт то, что нужно .. а не всякую ахинею как многим начинающим кодерам.

Re: Как сменить материал объекта?

VitaliyCh 08 сен 2011, 14:37

Guyver писал(а): http://www.google.ru/search?hl=ru&source=hp&q=Unity3d+reference+material&aq=f&aqi=g-L2&aql=&oq=

это я ответ даю самым маленьким . гугл итить его в душу .

ответы даны в 1х ссылках поиска

ответы как вы заметили из мануала юнити .

я знаю сикрет! .. у меня прем акаунт в гугле, и он мне даёт то, что нужно .. а не всякую ахинею как многим начинающим кодерам.

Re: Как сменить материал объекта?

DbIMok 08 сен 2011, 15:29

Re: Как сменить материал объекта?

Neodrop 08 сен 2011, 16:32

Изображение
«Спасибо!» нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.

  • Сайт

Re: Как сменить материал объекта?

VitaliyCh 08 сен 2011, 16:50

Ну GameObject и Script в данном примере я написал как указатели на тип, там естественно стоят переменные данного типа. Вместо GameObject реально стоит настоящее имя объекта, а вместо «Script» настоящее имя скрипта.

Re: Как сменить материал объекта?

VitaliyCh 08 сен 2011, 16:55

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

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] , Yandex [Bot] и гости: 26

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB

How to change Material and its properties at runtime in Unity?

In unity, we can apply multiple materials on a GameObject (if the gameObject mesh has multiple submeshes). These materials are listed in the “Mesh Renderer” component of the gameObject.

To change the material at runtime, add the following script to a gameObject with a Mesh Render component.

The GetComponent<MeshRenderer>().material property returns the first element of the materials array only. If you have more than one material applied to your gameObject, you can change the materials array from the MeshRenderer component with this code:

How to change Material Properties at runtime in Unity?

The Material properties are directly related to the shader attached to the material, so they can be changed by editing the shader properties. You can see the detailed list of the Shader properties and their types in the Inspector by clicking on “Edit Shader…”.

How to change a Material texture?

For example, to change the main texture of a Material, you have two options:

a- By accessing the mainTexture property:

b- By using the “SetTexture()” function:

You can use the “GetTexture()” function to get current main texture of the material.

You may need to use the “EnableKeyword” function to enable a property keyword of the shader before calling “SetTexture()” function.

How to change a Material color?

In the same way with textures, to change the main color of a Material, you have also two options:

a- By accessing the color property:

b- By using the “SetColor()” function:

Use the “GetColor()” function to get the main color of the material.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *