В каждой итерации по 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);
}