根据在 Unity 中查看的内容更改对象材质

本文关键字:对象 Unity | 更新日期: 2023-09-27 18:36:27

我正在尝试根据我投射的光线是否击中某个对象,在运行时更改对象的材质颜色。当我退出程序时,我希望它变回原来的材质颜色。

我的菜单包含我要切换的材料,具有突出显示功能,让用户知道他们将要选择的材料。在过去的几天里,我一直在尝试让它工作,我遇到了以下问题:

  • 我所需材质颜色的实例附加到游戏对象,但不会更改渲染材质

  • 高光材质颜色放置在我的游戏对象上,而不是我想要的实际材质

我已经没有关于如何解决这个问题的想法,我已经有了隧道视野,我需要一双新鲜的眼睛来观察我到目前为止所拥有的东西。

以前有人这样做过吗?你能告诉我我做错了什么吗?

这是我一直在使用的代码的当前状态:

我的类存储原始材料,以便在程序结束后可以切换回它。

    public GameObject targetMaterial;
public Color orignalMaterial;
//store GO original colour
void Awake()
{
    orignalMaterial = targetMaterial.renderer.material.color;
}
//highlight code
public void ChangeObjectMaterialColour(Color materialColour)
{
    targetMaterial.renderer.material.color = materialColour;        
}
//
void OnApplicationQuit()
{
    targetMaterial.renderer.material.color = orignalMaterial;
}

我如何尝试更改材质颜色,我想在三个不同的选项之间切换:

ChangeObjectColour new_colour1;
ChangeObjectColour new_colour2;
ChangeObjectColour new_colour3;
void Start () 
{
    new_colour1 = GameObject.Find("Colour 1").GetComponent<ChangeObjectColour>();
    new_colour2 = GameObject.Find("Colour 2").GetComponent<ChangeObjectColour>();
    new_colour3 = GameObject.Find("Colour 3").GetComponent<ChangeObjectColour>();
}

 void CastRay()
{
     if (Physics.Raycast(transform.position, fwd, out hit))
        {
            foreach(string t in _tags)
            {
                if(hit.collider.gameObject.tag == t)
                {
                    HighLight(hit.collider.gameObject);
                    hitTaggedObject = true;
                }                   
            }
            if(hit.collider.gameObject.tag == "Colour1")
            {       new_colour1.ChangeObjectMaterialColour(hit.collider.gameObject.renderer.material.color);
            }
            if(hit.collider.gameObject.tag == "Colour2")
            {       new_colour2.ChangeObjectMaterialColour(hit.collider.gameObject.renderer.material.color);
            }               
            if(hit.collider.gameObject.tag == "Colour3")
                {
   new_colour3.ChangeObjectMaterialColour(hit.collider.gameObject.renderer.material.color);
                }
        }

谁能看到我做错了什么?

根据在 Unity 中查看的内容更改对象材质

我认为问题的一部分是您访问材料属性的方式。以下是两种"非永久性"更改颜色和材料的扩展方法 此外,当应用程序退出时,您不必将颜色更改回来。它将在退出时自动恢复到其原始状态。

/// <summary>
/// Changes the material attached to the gameObject
/// </summary>
public static void ChangeMaterial(this GameObject go, Material mat)
{
    go.renderer.material = mat;
}
/// <summary>
/// Changes the color of the material
/// </summary>
public static void ChangeColor(this Material mat, Color color)
{
    mat.SetColor("_Color", color);              
}

我在单个运行时会话中使用这些方法数百次。将它们放在静态类中,并像调用其扩展类的成员一样调用它。

例如:

gameObject.renderer.material.ChangeColor(Color.red);
gameObject.ChangeMaterial( /* Your Material */ );

"_Color"是在着色器内部定义的颜色组件的名称。着色器中内置的所有单元都具有此属性。但是,如果您有自定义着色器,则情况可能并非如此,可以称为其他内容。不幸的是,没有办法以编程方式知道这一点,你只需要跟踪。