SetActive реагирует по-разному - PullRequest
0 голосов
/ 28 ноября 2018

В зависимости от входной строки я хочу активировать свои GameObjects в скрипте.Мои GameObjects имеют открытую строку, которую я сравниваю со значениями данного массива:

GameObject parent = GameObject.Find("Pick Ups");
int childCount = parent.transform.childCount;
foreach (var s in arr)
{
  for (int i = 0; i < childCount; ++i)
  {
    // Deactivate Target if it is not part of the Active Objects List
    if (s == parent.transform.GetChild(i).GetComponent<Rotator>().targetID)
    {
      parent.transform.GetChild(i).gameObject.SetActive(true);
      Debug.Log("Element " + s + " activated");
    } else { 
      parent.transform.GetChild(i).gameObject.SetActive(false);
    }
  }
}

Это работает нормально.Теперь я увеличиваю количество информации, получаемой для ввода, сохраняю ее в трехмерном массиве и зацикливаю первое измерение, содержащее ту же информацию, что и раньше:

var tArr = aTLString.Split('~')
                    .Select(x => x.Split('^')
                                  .ToArray()
                                  .Select(y => y.Split('`'))
                                                .ToArray())
                                  .ToArray();

for (int j = 0; j < tArr.GetLength(0); ++j)
{
  for (int i = 0; i < childCount; ++i)
  {
    // Deactivate Target if it is not part of the Active Objects List
    if (tArr[j][0][0] == parent.transform.GetChild(i).GetComponent<Rotator>().targetID)
    {
      parent.transform.GetChild(i).gameObject.SetActive(true);
      Debug.Log("Element " + tArr[j][0][0] + " activated");
    } else { 
      parent.transform.GetChild(i).gameObject.SetActive(false);
    }
  }
}

На этот раз элементне активирован.Я получаю обратную связь от консоли, что элемент активирован (поэтому tArr [j] [0] [0] содержит правильную строку), но SetActivate, похоже, не работает.

Я не понимаю вопроса

1 Ответ

0 голосов
/ 28 ноября 2018

В каждой итерации по tArr вы вызываете SetActive для всех объектов.
Даже если объект соответствует первому проходу, он деактивируется на последующих проходах, делаяэффективен только последний проход.

Ваш алгоритм равносилен (попытался сделать его максимально кратким):

public class Thing
{
    public int Id;
    public bool Active = false;
    public Thing(int id) { Id = id; }
}

void Main()
{
    var targetIds = new int[] {2, 5, 7 };
    var things = new Thing[] {new Thing(1), new Thing(2), new Thing(3)};

    foreach (var id in targetIds)
    {
        foreach (var thing in things)
        {
            thing.Active = thing.Id == id;
            Console.WriteLine($"{thing.Id} active: {thing.Active}");
        }
    }
}

Это выводит:

1 active: False
2 active: True
3 active: False
1 active: False
2 active: False
3 active: False
1 active: False
2 active: False
3 active: False

Выможно увидеть, что хотя ID 2 был сопоставлен в первой итерации по targetIds, он затем сбрасывается при последующих проходах.

Что вы, вероятно, хотите сделать, - это сначала установить все объекты как неактивные, и толькозатем выполните итерацию по tArr и активируйте совпавшие объекты, но не деактивируйте несопоставленные.

В качестве альтернативы вы можете перебрать только один раз по объектам и активировать их, если их идентификатор содержится в tArr.

foreach (var thing in things)
{
    thing.Active = targetIds.Contains(thing.Id);
}
...