2016-03-08 88 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)]; 
     } 
    } 
}