2013-03-08 4 views
0

Я хочу изменить параметр материала во время выполнения. Параметр называется «Радио 1» и определяется в пользовательском шейдере. Мне нужно изменение, которое я делаю для материала, чтобы воздействовать на все объекты, которые его используют, и это не работает. Как я могу это сделать?Измените материал во время выполнения

Я пытался получить один из объектов, которые используют этот материал и модифицируют sharedMaterial, а также попытался загрузки материала и его модификации, как это:

var mater = Resources.Load("BGRingMat") as Material; 
mater.SetFloat("Radio2", bgRingMaterialRadio2); 

Я не вижу никакого эффекта вообще. Как я могу это достичь?

+0

Это опечатка? Вы указываете выше параметр называется «Радио 1», но вы SetFloat на «Radio2» – Jerdak

ответ

1

Я только что проверил ваши дело. Он должен уметь работать так, как вы этого хотите. Если вы не получите нулевые значения, единственная ошибка, которую я могу себе представить, это то, что «Radio2» является неправильным именем переменной. Если вы попытаетесь изменить переменную с использованием неправильного имени, вы не получите никаких ошибок. В тексте вы указываете переменную как «Радио 1».

+0

Вы были правы, я объявил свойство шейдера как «_Radio2 (« Радио 2 »,« Поплавок ») = 0,6», я использовал «Radio2» вместо «_Radio2», – Damian

0

Глобально изменить значение шейдера для всех экземпляров этого материала:

Material mat = Resources.Load("BGRingMat") as Material; 
mat.SetFloat("Radio2", bgRingMaterialRadio2); 

Или изменить для 1 объекта:

renderer.material = Resources.Load("BGRingMat") as Material; 
renderer.material.SetFloat("Radio2", bgRingMaterialRadio2); 

Обратите внимание, что если вы измените материал объекта непосредственно первым, а затем попробовать для использования общего материала ничего не произойдет:

Material mat = Resources.Load("BGRingMat") as Material; 

// Sets Radio2 to bgRingMaterialRadio2 
renderer.material.SetFloat("Radio2", bgRingMaterialRadio2); 

// Doesn't do anything to the current object as this object now has its own copy. 
mat.SetFloat("Radio2", 0.0f); 
+0

Вы уверены? Я всегда задавал общие параметры материала через материал напрямую. И AFAIK должен существовать только один экземпляр материала, чтобы поделиться им, поэтому я считаю, что renderer.material - это просто ссылка на ранее созданный общий материал. – Heisenbug

+0

@Heisenbug Вы правы, плохое предположение с моей стороны. Но, renderer.material не разделяется. Renderer.material, насколько я могу судить, при первом вызове создает уникальный экземпляр шейдера для этого объекта. В противном случае SetFloat всегда будет изменять общий шейдер. Вы можете проверить это с помощью моего последнего кода. Я предполагаю, что внутри это просто создает другой проход для этой комбинации шейдеров/мешей. – Jerdak

Смежные вопросы