2016-03-08 69 views
0

我有一个非常具体的问题。我的场景中除了彼此之外,还有一堆立方体。在运行时无法访问对象

当我点击其中一个立方体变成红色(或其他颜色在我的阵列中)几秒钟,并且此脚本适用于我的所有立方体。

现在我想要发生的是只要其中一个立方体是红色的,其他的是不可访问的(当我点击它们时,它们不会改变颜色)。

这是我的立方体代码:

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)]; 
} 
+2

您的示例代码不完整,并不反映您正在解释的行为。试着给出更多的代码来解释你想要达到的目标。 – CarbineCoder

+0

一种可能的解决方案是获取事件处理程序中所有立方体的颜色。如果任何立方体是红色的,则不应该做任何事情。 – HimBromBeere

回答

2

您将需要设置一个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)]; 
    } 
} 

这种方法的缺点是,如果有很多立方体,它会稍微慢一些。

+0

非常感谢,第一个解决方案是我在找的 – ali10gaucho

+0

虽然我不明白第二个解决方案,但总共有30个立方体会使第二个解决方案更容易 – ali10gaucho

+0

@ ali10gaucho第二个解决方案需要添加所有你的立方体列表,当你通过'OnMouseDown'来调用更新立方体时,它使用linq方法'Any'来检查任何具有红色的立方体。如果没有红色立方体,则它分配颜色,否则它将继续,即阻止呼叫。 – TheLethalCoder

0

糟糕...我以为我张贴了我的答案,但它没有通过。无论哪种方式,代码已经写好,我不能把它扔掉。这个方法使用数组。将数组大小从编辑器更改为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)]; 
     } 
    } 
}