unity3d Unity在运行时替换材质

u59ebvdq  于 2023-04-21  发布在  其他
关注(0)|答案(2)|浏览(295)

我尝试在运行时根据我选择的标签更改对象的材质。然而,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;
}
67up9zun

67up9zun1#

试试这个扩展方法

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");
}
8mmmxcuj

8mmmxcuj2#

好吧,这是我试图避免的代码类型。因为我需要更改许多游戏对象(超过100个)使用的纹理,我不想只是循环遍历所有这些对象,这将是非常资源密集型的。相反,我希望有一个解决方案来更改资源中的实际纹理,保持所有渲染器引用该纹理,但更改纹理
该代码需要在运行时运行,而不是在编辑时运行,我没有UnityEditor的访问权限。我想在游戏编译和运行后从脚本更改纹理。我将替换的纹理将从外部文件加载。

相关问题