Unity中動態改變物體的Material(Shader)
阿新 • • 發佈:2018-12-26
在Unity中,我們在進行物體控制和互動過程中經常會涉及到動態改變Shader的情況,如將一個三維物體用網格顯示、將三維物體的表現形式進行變更等等。
在Unity中主要通過MeshRenderer元件進行控制,我們可以通過獲取指定物體的MeshRenderer元件,對其中的屬性進行賦值即可改變屬性。
Material material = new Material(Shader.Find("Transparent/Diffuse"));
material.color = Color.green;
//material.SetVector("_Color",new Vector4(1,1,1,1 ));
GetComponent<Renderer>().material = material;
在一些情況下,某一個物體的Material部分包含多個材質,在這種情況下,我們可以通過
GetComponment<Renderer>().materials
來獲取所有的材質,通過對特定的材質進行動態賦值可以改變其中的屬性。
當我們需要在不同種類的Material間切換時,可以將每種不同型別的Material都儲存到特定的資料結構中
public class NormalMaterialInfo
{
public string ObjectName;
public Material[] ObjectMaterials;
}
我們通過定義不同型別的Material[]陣列,根據物體的名稱來動態載入和儲存。
private Material[] GetNormalMaterials(string name)
{
foreach (var info in normalMaterialInfoList)
{
if (info.ObjectName == name)
{
return info.ObjectMaterials;
}
}
return null;
}
private void SaveMaterialInfo()
{
foreach (var part in Car.GetComponentsInChildren<MeshRenderer>())
{
NormalMaterialInfo info = new NormalMaterialInfo();
info.ObjectMaterials = part.GetComponent<Renderer>().materials;
info.ObjectName = part.name;
normalMaterialInfoList.Add(info);
}
}