找回密码
 立即注册
查看: 1471|回复: 15

[简易教程] Unity中动态改变物体的Material(Shader)

[复制链接]
发表于 2018-8-30 14:55 | 显示全部楼层 |阅读模式
在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);
        }
    }
发表于 2018-9-17 12:15 | 显示全部楼层
很不错
发表于 2018-9-17 11:58 | 显示全部楼层
楼主是超人
发表于 2018-9-17 11:28 | 显示全部楼层
顶顶多好
发表于 2018-9-17 11:22 | 显示全部楼层
真心顶
发表于 2018-9-17 11:23 | 显示全部楼层
很好哦
发表于 2018-10-18 09:29 | 显示全部楼层
很不错
发表于 2018-10-18 08:43 | 显示全部楼层
楼主是超人
发表于 2018-10-18 09:05 | 显示全部楼层
顶顶多好
发表于 2018-10-18 08:59 | 显示全部楼层
难得一见的好帖
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-18 12:40 , Processed in 0.096102 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表