从动态更改的对象列表中删除多余的对象

问题描述 投票:0回答:2

我目前正在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.
}
    }
}
c# unity3d
2个回答
2
投票

反转循环以从列表中删除项目。

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
投票

List不是UnityEngine类,如果你在Unity上寻找List方法,你将永远找不到。但是在Microsft API文档中你可以。

我从未在Unity中使用过list,但我认为这种方式应该有效:

currentPlayers.RemoveAt(removed_controller_index);

查看更多Microsoft文档列表:qazxsw poi

© www.soinside.com 2019 - 2024. All rights reserved.