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

Posted

技术标签:

【中文标题】根据在 Unity 中查看的内容更改对象材质【英文标题】:Changing an objects material based on what is looked at in Unity 【发布时间】:2013-10-31 04:57:22 【问题描述】:

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

我的菜单与我想要切换的材料有一个突出显示功能,让用户知道他们将要选择的材料。在过去的几天里,我一直在努力让它发挥作用,但遇到了以下问题:

我想要的材质颜色实例已附加到游戏对象,但不会更改渲染材质

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

我已经没有关于如何解决这个问题的想法,并且我已经对此有了狭隘的看法,我需要一双新的眼睛来审视我到目前为止所拥有的东西。

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

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

我的班级存储原始资料,以便在程序结束后切换回原来的资料。

    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);
                
        

谁能看到我做错了什么?

【问题讨论】:

【参考方案1】:

我认为部分问题在于您访问材料属性的方式。这里有两种更改颜色和材质的扩展方法“不是永久”当应用程序退出时您也不必更改颜色。它会在退出时自动恢复到原来的状态。

/// <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”是在着色器内部定义的颜色组件的名称。着色器中的所有统一体都具有此属性。但是如果你有一个自定义着色器,情况可能就不是这样了,它可以被称为别的东西。不幸的是,没有办法以编程方式知道这一点,您只需要跟踪即可。

【讨论】:

以上是关于根据在 Unity 中查看的内容更改对象材质的主要内容,如果未能解决你的问题,请参考以下文章

选择和取消选择游戏对象以更改材质

Unity学习笔记2:材质与着色器

Unity学习笔记2:材质与着色器

Unity学习笔记2:材质与着色器

Unity 2018.3 HDRP - 以编程方式更改材质颜色?

unity 怎么为组件设置材质?