You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity动态玩家列表:如何移除手柄断开时的多余光标对象?

很高兴看到你最终摸索出了解决方案!针对你在Unity新Input System环境下,管理玩家光标列表与手柄动态连接/断开同步的问题,我来把整个过程和最终的有效方案整理清楚:

问题背景

你正在做一个测试新Input System的小型Unity项目,核心需求是:

  • 为每个连接的手柄玩家创建一个可独立操控的光标
  • 手柄连接时,动态实例化光标对象并存入currentPlayers列表
  • 遇到的痛点:当玩家断开手柄后,不知道如何移除场景中不在列表内的多余对象,过往类似场景的尝试也没找到合适的解决办法
原有添加玩家代码

你最初实现的添加玩家逻辑如下:

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];
        currentPlayers.Add(obj.gameObject);
    }
}
解决思路与最终方案

虽然Kevin的方案没有直接解决你的问题,但它帮你打开了思路,最终你找到了简洁有效的同步逻辑:在原有的DynamicADP方法中,新增判断当currentPlayers列表长度大于已连接的Gamepad.all.Count时,销毁列表最后一个对应的光标对象,并从列表中移除该元素,以此保持列表与实际连接手柄数量一致。

最终完整的DynamicADP方法代码:

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];
        currentPlayers.Add(obj.gameObject);
    }

    // 新增的移除多余玩家逻辑
    if(currentPlayers.Count > Gamepad.all.Count){
        Destroy(currentPlayers[currentPlayers.Count - 1]);
        currentPlayers.RemoveAt(currentPlayers.Count - 1);
        // 当列表长度与已连接手柄数不一致时,移除场景中和列表里的最后一个对象
    }
}

这个方案的巧妙之处在于利用了列表长度的对比来快速定位需要移除的对象,逻辑简单直接,完美解决了手柄断开时场景对象与列表不同步的问题。

内容的提问来源于stack exchange,提问作者Spyro the A.L.D

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:42:02