2013-03-08 90 views
0

我想在運行時修改材質的參數。該參數被稱爲「Radio 1」,並在自定義着色器中定義。我需要對材質所做的更改來影響所有正在使用它的對象,但這不起作用。 我該怎麼做?在運行時修改材質

我試着讓使用該材料,並修改sharedMaterial的對象之一,也試過裝材料,並修改它是這樣的:

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

我看完全沒有影響。 我該如何做到這一點?

+0

這是一個錯字?你在狀態參數上方稱之爲「Radio 1」,但你在「Radio2」上設置了浮標 – Jerdak 2013-03-08 02:54:58

回答

1

我剛剛測試過您的案件。它應該能夠按照您的期望工作。如果你沒有得到任何空引用,我能想象的唯一錯誤就是「Radio2」是一個錯誤的變量名。如果您嘗試使用錯誤的名稱修改變量,則不會出現任何錯誤。在你的文本中,你提到變量爲「Radio 1」。

+0

你是對的,我宣佈着色器的屬性爲「_Radio2(」Radio 2「,Float)= 0.6」,我使用的是「Radio2」而不是「_Radio2」 – Damian 2013-03-10 19:09:34

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 2013-03-08 08:41:25

+0

@Heisenbug你是對的,對我來說是不好的假設。但是,renderer.material不是共享的。就我所知,Renderer.material在第一次調用時創建該對象的着色器的唯一實例。否則,SetFloat將始終修改共享着色器。你可以用我最後的代碼位來測試它。我在內部假設這只是爲這個着色器/網格組合創建了另一個通行證。 – Jerdak 2013-03-08 12:45:01