我正在尝试根据我投射的光线是否撞击某个物体,在运行时更改我的物体材质颜色。当我退出程序时,我想让它改回原来的材料颜色。
我的菜单中包含我要切换的素材,其中有一个突出显示功能,可让用户知道他们要选择的素材。在过去的几天里,我一直试图让它工作,我遇到了以下问题:
我想要的材质颜色的实例附加到游戏对象但不会更改渲染的材质
高光材质颜色放在我的游戏对象上,而不是我想要的实际材质
我已经没有关于如何解决这个问题的想法,而且我已经获得了隧道视觉,我需要一双新眼睛来看看我到目前为止的情况。
有没有人曾经这样做过?你能告诉我这是错的吗?
这是我一直在使用的代码的当前状态:
我的课程存储原始资料,以便在程序结束后可以切换回原材料。
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);
}
}
任何人都能看到我做错的事吗?
答案 0 :(得分:0)
我认为问题的一部分是您访问材料属性的方式。这里有两种扩展方法可以改变颜色和材质“非永久性”。当应用程序退出时,您不必更改颜色。它会在退出时自动恢复到原始状态。
/// <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”是着色器内定义的颜色分量的名称。在着色器中构建的所有统一都具有此属性。但是如果你有一个自定义着色器,可能不是这种情况,它可以被称为其他东西。不幸的是,没有办法以编程方式知道这一点,你只需要跟踪。