Unity中按下Tab键时如何正确更新List[index]?
问题分析与解决方案
嘿,刚接触Unity遇到这种小问题太正常啦,我来帮你捋清楚问题出在哪,以及怎么修复~
首先,你的核心问题出在输入检测的API选择上:你用了Input.GetKey(KeyCode.Tab),这个方法的特性是——只要你按住Tab键,每一个游戏帧都会返回true。而Unity的Update方法每秒会执行几十次(取决于当前帧率),所以按住Tab的那一瞬间,ChangeLeader会被疯狂调用,index一路自增到列表末尾,自然就一次性打印出所有对象的名称了。
修复代码
只需要把Input.GetKey换成Input.GetKeyDown就可以解决!这个API的特性是仅在按键被按下的那一帧返回true,完美匹配你“按一次Tab触发一次切换”的需求。同时我们可以调整一下逻辑顺序,让边界处理更顺畅:
private int index; public List<GameObject> playerList; private GameObject leader; void Start() { index = 0; // 可选:启动时直接选中第一个对象并打印 if(playerList != null && playerList.Count > 0){ leader = playerList[index]; Debug.Log("初始选中角色: " + leader.name); } } void Update(){ ChangeLeader(); } void ChangeLeader(){ // 先检测按键输入,避免无意义的边界判断 if (Input.GetKeyDown(KeyCode.Tab)){ // 先自增索引,再处理循环逻辑 index += 1; if (index >= playerList.Count){ index = 0; } leader = playerList[index]; Debug.Log("当前选中角色: " + leader.name); } }
额外小细节调整
如果你希望先打印当前选中的对象,再切换索引(完全匹配你描述的预期效果),可以把代码改成这样:
void ChangeLeader(){ if (Input.GetKeyDown(KeyCode.Tab)){ // 先打印当前索引对应的对象 Debug.Log("当前选中角色: " + playerList[index].name); // 再自增索引并处理循环 index += 1; if (index >= playerList.Count){ index = 0; } leader = playerList[index]; } }
最后别忘了在Unity编辑器的Inspector面板里给playerList赋值哦,不然会出现空引用错误哒~
内容的提问来源于stack exchange,提问作者Pablo Gasamans Losada
相关产品推荐
相关产品推荐

