#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