【发布时间】:2021-10-30 11:08:57
【问题描述】:
我创建了一个右键菜单,当我将鼠标放在该菜单中的按钮上时,我想让对象改变材质颜色。
这是代码:
Color[] startCo;
public void OnPointerEnter(PointerEventData eventData)
{
GameObject[] objects = GameObject.FindGameObjectsWithTag(myMenu.selected.title);
for (int i = 0; i < startCo.Length; i++)
{
startCo[i] = objects[i].gameObject.GetComponent<MeshRenderer>().material.color;
}
foreach (GameObject obj in objects)
{
obj.gameObject.GetComponent<MeshRenderer>().material.color = Color.red;
}
}
public void OnPointerExit(PointerEventData eventData)
{
GameObject[] objects = GameObject.FindGameObjectsWithTag(myMenu.selected.title);
for (int i = 0; i < objects.Length; i++)
{
objects[i].gameObject.GetComponent<MeshRenderer>().material.color = startCo[i];
}
}
使用第一个 for 循环它根本不起作用,但是没有它,当我将鼠标放在按钮上时,它会使材质颜色变为红色,但不会将其改回原始颜色。
我的问题是,有没有更好的方法来使用 foreach 来保存原始颜色?
【问题讨论】:
-
你说“根本不起作用”是什么意思。它是否显示构建错误?乍一看,我认为
objects[i].gameObject确实没有意义。这甚至可以编译吗?objects[i]已经是游戏对象,所以objects[i].GetComponent<MeshRenderer>应该可以正常工作。 -
@ThomasHilbert,“根本不起作用”,我的意思是它甚至不会将材质颜色更改为红色(不使用它,它会改变它)。 “objects[i].gameObject” 以两种方式编译,我刚刚检查过了。但我不知道如何将材质颜色更改为原始颜色。
-
如果是这种情况,您的 for 循环中最有可能出现错误
null reference error -
第一次调用
OnPointerEnter时,startCo为 null 或startCo.Length为零。 -
您可能希望在您的
OnPointerEnter处理程序中将for (int i = 0; i < startCo.Length; i++)更改为for (int i = 0; i < objects.Length; i++)。但是,您需要先分配数组。 (我在 C++ 领域已经有一段时间了;不确定这里的 C# 机制。)