Удаление лишних объектов из динамически меняющегося списка объектов - PullRequest
0 голосов
/ 30 марта 2019

В настоящее время я работаю над небольшим проектом в 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);
    }
}

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

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

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.
}
    }
}

Ответы [ 2 ]

2 голосов
/ 30 марта 2019

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

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); 
    }
}
0 голосов
/ 30 марта 2019

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

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

currentPlayers.RemoveAt(removed_controller_index);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...