Удаление лишних объектов из динамически изменяющегося списка объектов

#c# #unity3d

#c# #unity3d

Вопрос:

В настоящее время я работаю над небольшим проектом в Unity, чтобы протестировать некоторые новые функции, в первую очередь новую систему ввода, и у меня возникли некоторые проблемы со списками. Моя цель в этом проекте — создать скрипт, который создает небольшой курсор для каждого игрока, чтобы использовать его и перемещать с помощью своих соответствующих контроллеров.

В настоящее время я создаю и сохраняю объекты в списке во время выполнения всякий раз, когда мой компьютер обнаруживает новый контроллер геймпада. С чем у меня возникают проблемы, так это с поиском метода, который удаляет лишние объекты, которых нет внутри списка, т. Е. Когда размер списка уменьшается, что в данном случае происходит, когда игрок отключает свой геймпад. Контроллер.

У меня возникали похожие проблемы в прошлых проектах, когда мне приходилось добавлять и удалять элементы из списка при попытке уничтожить указанные элементы в сцене.

Я пытался найти такой ответ при попытке добиться этого эффекта на нескольких веб-сайтах (включая этот), но безрезультатно.

Это мой текущий код, который я использую в данный момент для добавления проигрывателей всякий раз, когда добавляется новое устройство.

 
public GameObject cursorPrefab;
public int amountOfPlayers = 4;
List<GameObject> currentPlayers = new List<GameObject>();

private void DynamicADP(){
  if(Gamepad.all.Count > amountOfPlayers) return;
  for(int i = 0; i < Gamepad.all.Count; i  ){
       if(currentPlayers[i] != null) continue;
       Cursor obj = Instantiate(cursorPrefab).GetComponent<Cursor>();
       obj.PlayerDevice = Gamepad.all[i];
       currentPlayer.Add(obj.gameObject);
    }
}
  

Редактировать: Хотя решение Кевинса не совсем решило проблему, оно, однако, помогло мне расширить мой взгляд на проблему, что в конечном итоге привело к решению того, чего я хочу, с помощью этого фрагмента кода! Поэтому я приму ответ Кевина за это! Спасибо, Кевин!

Вот что я добавил, это очень просто.

 private void DynamicADP(){

    //Previous logic from the code snipper above

    if(currentPlayers.Count > Gamepad.all.Count){
       Destroy(currentPlayers.Count[currentPlayers.Count - 1]);
       currentPlayers.RemoveAt(currentPlayers.Count - 1);
       //Whenever there is a difference in size on both lists, remove the last 
       //object from both in-scene and from currentPlayers list.
}
    }
}
  

Комментарии:

1. вы не можете увеличивать список с начала и удалять элементы из середины, потому что список меняется, если вы начнете с конца и выполните цикл в обратном направлении, он будет работать нормально — здесь много раз отвечали…

2. Действительно? Я никогда не сталкивался с решением такого рода. Я никогда даже не думал об изменении порядка. я попробую это, как только у меня будет немного времени. Если это сработает (а я уверен, что так и будет), тогда я отмечу ваш ответ c:

3. Хорошо, я провел некоторые эксперименты и нашел очень простое решение, вдохновленное вашим комментарием. Хотя ваше решение вообще не решило проблему, оно предложило мне новый взгляд на проблему, который помог мне решить ее в первую очередь, поэтому я отмечу это как ответ.

Ответ №1:

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

 private void DynamicADP(){
   if(Gamepad.all.Count > amountOfPlayers) return;
   for(int i = Gamepad.all.Count-1; i >=0 ; i--){
       if (somelogic) Gamepad.all.RemoveAt(i); 
    }
}
  

Ответ №2:

List не является классом UnityEngine, если вы ищете методы List в unity, вы никогда не найдете. Но в документации Microsft API вы можете.

Я никогда не использовал list в Unity, но я думаю, что этот способ должен сработать:

 currentPlayers.RemoveAt(removed_controller_index);
  

Смотрите больше списков в документах Microsft:
https://learn.microsoft.com/pt-br/dotnet/api/system.collections.generic.list-1?view=netframework-4.7.2