2016-03-08 3 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

Одним из возможных решений было бы получить цвета всех ваших кубов внутри event-hanlder. Если какой-либо куб красного цвета, то ничего не следует делать. – 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)]; 
     } 
    } 
} 
Смежные вопросы