在运行时无法访问对象
我有一个非常具体的问题。我的场景中除了彼此之外,还有一堆立方体。在运行时无法访问对象
当我点击其中一个立方体变成红色(或其他颜色在我的阵列中)几秒钟,并且此脚本适用于我的所有立方体。
现在我想要发生的是只要其中一个立方体是红色的,其他的是不可访问的(当我点击它们时,它们不会改变颜色)。
这是我的立方体代码:
private renderer render;
void Start()
{
render = GetComponent<renderer>();
}
private Color[] colors = {Color.red, Color.green, color.yellow);
void Update(){}
void OnMouseDown()
{
render.material.color = colors[Random.Range(0, colors.Lenght)];
}
您将需要设置一个class
水平Boolean
控制在当立方体的一个是红色的,例如:
static bool _bBlockMouseDown;
void OnMouseDown()
{
Color color = colors[Random.Range(0, colors.Lenght)];
if (color == Color.Red)
{
_bBlockMouseDown = true;
render.material.color = color; //Force the color to be set here
}
if (!_bBlockMouseDown)
{
render.material.color = color;
}
}
此代码将立方体更改为随机颜色,如果它是红色,则将Boolean
设置为true,以阻止任何其他立方体设置其颜色。所有这些需求是立方体不再变红时,只需将_bBlockMouseDown
变量更改为true即可。
注意:_bBlockMouseDown
变量是静态的,因此它在所有立方体中包含相同的值。
另一种解决方法是使用System.Linq
命名空间并有一个多维数据集列表。像下面这样:
void OnMouseDown()
{
if (!listOfCubes.Any(c => c.material.color == Color.Red))
{
render.material.color = colors[Random.Range(0, colors.Lenght)];
}
}
这种方法的缺点是,如果有很多立方体,它会稍微慢一些。
非常感谢,第一个解决方案是我在找的 – ali10gaucho
虽然我不明白第二个解决方案,但总共有30个立方体会使第二个解决方案更容易 – ali10gaucho
@ ali10gaucho第二个解决方案需要添加所有你的立方体列表,当你通过'OnMouseDown'来调用更新立方体时,它使用linq方法'Any'来检查任何具有红色的立方体。如果没有红色立方体,则它分配颜色,否则它将继续,即阻止呼叫。 – TheLethalCoder
糟糕...我以为我张贴了我的答案,但它没有通过。无论哪种方式,代码已经写好,我不能把它扔掉。这个方法使用数组。将数组大小从编辑器更改为5,并将5个立方体分配给它。红色立方体只会改变颜色,除非场景中没有红色立方体,否则将不会改变颜色。
public GameObject[] cubes;
void Start()
{
}
private Color[] colors = { Color.red, Color.green, Color.yellow };
void Update()
{
checkMouseClick();
}
void checkMouseClick()
{
MeshRenderer tempMR;
//Check if mouse button is pressed
if (Input.GetMouseButtonDown(0))
{
RaycastHit hitInfo = new RaycastHit();
if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hitInfo))
{
tempMR = hitInfo.collider.gameObject.GetComponent<MeshRenderer>();
int cubeSize = cubes.Length;
//Loop through all the cubes in in cubes array
for (int i = 0; i < cubeSize; i++)
{
//Check if any of them have a red color
if (cubes[i].GetComponent<MeshRenderer>().material.color == Color.red)
{
//if the cube we clicked is alread read, go ahead and generate a new color for it, else DONT CHANGE THE COLOR
if (cubes[i] == hitInfo.collider.gameObject)
{
}
else
{
return; //Exit if any cube has the red color
}
}
}
//No cube has a red color, change the color of clicked cube to a random color
tempMR.material.color = colors[Random.Range(0, colors.Length)];
}
}
}
您的示例代码不完整,并不反映您正在解释的行为。试着给出更多的代码来解释你想要达到的目标。 – CarbineCoder
一种可能的解决方案是获取事件处理程序中所有立方体的颜色。如果任何立方体是红色的,则不应该做任何事情。 – HimBromBeere