我目前正在Unity中开展一个小项目来测试一些新功能,主要是new Input System,我在列表中遇到了一些麻烦。我在这个项目中的目标是创建一个脚本,为每个玩家创建一个小光标,并使用各自的控制器移动。
目前,只要我的计算机检测到新的游戏手柄控制器,我就会在运行时在列表中创建和存储对象。我遇到的问题是找到一种方法来删除不在列表中的多余对象,即当列表缩小时,在这种情况下,当播放器断开其Gamepad控制器时。
在尝试销毁场景中的所述项目时,每当我必须在列表中添加和删除项目时,我在过去的项目中遇到了类似的问题。
我试图在多个网站(包括这个网站)上试图获得这样的效果,但是没有占上风。
这是我目前正在使用的代码,用于在添加新设备时添加播放器。
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.
}
}
}
反转循环以从列表中删除项目。
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);
}
}
List不是UnityEngine类,如果你在Unity上寻找List方法,你将永远找不到。但是在Microsft API文档中你可以。
我从未在Unity中使用过list,但我认为这种方式应该有效:
currentPlayers.RemoveAt(removed_controller_index);
查看更多Microsoft文档列表:qazxsw poi