1. 程式人生 > >Unity中動態改變物體的Material(Shader)

Unity中動態改變物體的Material(Shader)

在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); } }