Если все игровые объекты в списке соответствуют условию

Как проверить, соответствуют ли все игровые объекты в списке определенному условию в Unity? У меня есть 9 коллайдеров с одним и тем же скриптом. У них у всех есть список, который меняется с помощью этого кода, но он возвращает странные результаты.

void Update()
{
    for (int i = 0; i < ChildTiles.Count; i++) 
    {
        if (ChildTiles [i].GetComponent<SpriteRenderer> ().color == Green) 
        {
            _greenComplete = true;
        } 
        else 
        {
            _greenComplete = false;
        }
        //Debug.Log (gameObject + "ChildTiles[i]" + ChildTiles [i]);
    }
    Debug.Log (gameObject + "Green Complete " + _greenComplete);
}

Странно то, что верхний правый коллайдер возвращает True с двумя игровыми объектами зеленого цвета, а нижний правый коллайдер возвращает false с двумя игровыми объектами зеленого цвета.

https://i.gyazo.com/cb3352585720e2e630315a268a436fb6.png

Это инспектор правого верхнего коллайдера во время этого результата:

https://i.gyazo.com/aa210144daf5fb663292fff1fa198b27.png

Это инспектор нижнего правого коллайдера во время этого результата:

https://i.gyazo.com/97ad742e723a31dddea7ab43eaf8e31a.png

Как я могу это решить?


person J.K. Harthoorn    schedule 17.09.2017    source источник
comment
Еще один хороший вопрос. Спасибо.   -  person statosdotcom    schedule 21.02.2018


Ответы (1)


Проблема исходит из вашего цикла for. Посмотрите внимательно на то, что вы написали. Для каждого элемента вашего списка вы проверяете, является ли цвет его компонента SpriteRenderer зеленым. Если это так, вы устанавливаете _greenComplete в true, в противном случае вы устанавливаете его в false.

Теперь давайте посмотрим на ваши два списка и попробуем применить этот алгоритм к каждому из них. Для первого списка:

  • Первый элемент желтый. _greenComplete установлено значение false.
  • Второй элемент зеленый. _greenComplete установлено значение true.
  • Третий элемент красный. _greenComplete имеет значение false.
  • Четвертый элемент зеленый. _greenComplete установлено значение true.

Вы видите, в чем сейчас проблема? Вы не определяете, содержит ли ваш список зеленый элемент. Вы последовательно определяете, зеленый ли последний проанализированный элемент. Как мы только что видели для вашего первого списка, в конце окончательный результат верен, потому что последний элемент вашего списка зеленый. Глядя на ваш второй список:

  • Первый элемент зеленый. _greenCompleteустановлено значение true.
  • Второй элемент зеленый. _greenComplete установлено значение true.
  • Третий элемент красный. _greenComplete установлено значение false.
  • Четвертый элемент желтый. _greenComplete имеет значение false.

Ваш список содержал два зеленых элемента, но последний проанализированный элемент не был зеленым, что привело к ложному значению, которое вы получили в конце.

Чтобы исправить свой код и получить реальный ответ, который вы хотите, вы предпочитаете цикл while, который остановится, как только вы найдете зеленый элемент, отличный от зеленого в вашем списке (вы начинаете предполагать, что все элементы зеленые, действительно зеленые , и проверьте, если это не так):

void Update()
{
    int i = 0;
    _greenComplete = true;

    while(i < ChildTiles.Count && _greenComplete) 
    {
        if (ChildTiles [i].GetComponent<SpriteRenderer> ().color != Green) 
        {
            _greenComplete = false;
        } 

        i++;
    }

    Debug.Log (gameObject + "Green Complete " + _greenComplete);
}

Вы также можете использовать LINQ для этого вопроса:

_greenComplete  = ChildTiles.All (c => c.GetComponent<SpriteRenderer> ().color == Green);
person Isuka    schedule 17.09.2017
comment
Это возвращает True, даже если в списке есть только один зеленый объект. - person J.K. Harthoorn; 19.09.2017
comment
Хорошо, я использую этот код прямо сейчас: pastebin.com/0u2EH6iT. Он ждет, пока завершится вращение, а затем проверяет, есть ли совпадение 4 цветов. Проблема сейчас заключается в том, что когда каждый цвет соответствует, он возвращает True только тогда, когда вы нажимаете кнопку, которая проверяет, совпадают ли цвета. Почему это? Вот гифка, чтобы лучше понять: gyazo.com/a2a5c8a5051e937338807fb5ecfaa4ec - person J.K. Harthoorn; 19.09.2017
comment
@ JKHarthoorn А, значит, вы хотите, чтобы все цвета совпадали, я не понял этого из вашего вопроса. Тогда я отредактировал свой ответ по этому поводу. Что касается другой вашей проблемы, это трудно понять только с помощью этого фрагмента кода. Вероятно, вам следует выполнять тест каждый раз после того, как ваши квадраты вращаются. - person Isuka; 19.09.2017
comment
Но это то, что я уже делаю, потому что он ждет 1 секунду, а вращение занимает 0,5 секунды. Проблема в том, что он проверяет только последний нажатый коллайдер. - person J.K. Harthoorn; 19.09.2017
comment
Что именно содержит ChildTiles? - person Isuka; 19.09.2017
comment
ChildTIles — это список, прикрепленный к каждому коллайдеру (за каждой кнопкой). Список содержит 4 плитки вокруг коллайдера. - person J.K. Harthoorn; 19.09.2017
comment
Тогда вот в чем проблема. Вся ваша сетка не проверена, только 4 плитки вокруг кнопки. Вместо этого вы должны вызвать функцию, которая проверяет, заполнены ли все квадраты нужными цветами. - person Isuka; 19.09.2017
comment
Но как мне это сделать? - person J.K. Harthoorn; 19.09.2017
comment
Это вопрос, отличный от вопроса в этой ветке, поэтому, я думаю, вам следует закрыть этот и открыть новый. Но чтобы дать вам представление, у меня был бы объект, ссылающийся на все случаи на вашей доске, и в коде я бы сделал цикл, который проверяет каждую пару элементов 2 x 2, если их цвет совпадает. Если каждая пара отвечает верно, это означает, что ваша доска готова. - person Isuka; 19.09.2017
comment
Разве нельзя отредактировать ваш ответ вместо того, чтобы создавать новую тему? Это четвертая тема от меня по этому вопросу.. Это мне очень поможет. - person J.K. Harthoorn; 19.09.2017
comment
@ J.K.Harthoorn Одна ветка посвящена одной проблеме. На SO не принято внезапно менять вопрос, чтобы превратить его во что-то другое, поэтому я сожалею об этом. Кроме того, мне не хватает большого количества информации о коде, чтобы действительно помочь вам в вопросе, который вы спрашиваете, что делает невозможным дать вам правильный ответ здесь. - person Isuka; 19.09.2017