您的位置:首页 > 移动开发 > Unity3D

Unity中动态改变物体的Material(Shader)

2017-05-27 22:12 1366 查看
在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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息