Unity在运行时替换材料

时间:2013-10-21 17:13:23

标签: c# unity3d raycasting material

我正在尝试根据我选择的标签在运行时更改对象的材质。但是,Unity不是替换材质,而是添加目标材质的实例并将其添加到对象中。

我是否可以通过代码删除现有资料并将其替换为目标材料?

这是我目前处理此问题的代码:

if(hit.collider.gameObject.tag == "Colour1")
{
    GameObject[] _Colums = GameObject.FindGameObjectsWithTag("column");
    foreach( GameObject c in _Colums)
    c.renderer.material.color = hit.collider.gameObject.renderer.material.color;
}

1 个答案:

答案 0 :(得分:1)

尝试此扩展方法

public static void ChangeMaterial(this GameObject go, Material mat)
{
    go.renderer.material = mat;
}

然后你可以使用

来调用它
if(hit.collider.gameObject.tag == "Colour1")
{
     hit.gameObject.renderer.material.ChangeMaterial( Your Material );
}

这是另一种更改颜色的扩展方法

public static void ChangeColor(this Material mat, Color color)
{
    mat.SetColor("_Color", color);      
}

编辑:在gameObject上找到支持多种素材的旧扩展方法

public static void ChangeColor(this GameObject go, Color color)
{
    if(go.GetComponent<MeshRenderer>())
    {               
        Material[] materials = go.gameObject.renderer.materials;

        foreach(Material m in materials)
        {
            m.SetColor("_Color", color);
        }   
    }
}

最后,为了更具体地解决您的问题,这是您的最后一项功能

public static void ChangeColor(GameObject[] gameObjects, Color color)
{
    foreach(GameObject gameObject in GameObjects)
    {
        gameObject.renderer.material.ChangeColor( "Your Color" );
    }
}

然后你可以这样称呼它:

if(hit.collider.gameObject.tag == "Colour1")
{
    GameObject[] _Colums = GameObject.FindGameObjectsWithTag("column");
    ChangeColor(_Colums, "Your Color");
}