Unity3D中If-Else语句异常:按下G键同时激活G1与G2
问题原因
OnTriggerStay会在碰撞体持续接触的每一帧都被调用,而Input.GetKeyDown("g")在按键按下的那一帧会持续返回true。如果G1初始状态为未激活,按下G键的第一帧:
- 第一次执行
OnTriggerStay时激活G1; - 同一帧内
OnTriggerStay可能因碰撞持续再次触发(或G1激活后自身碰撞体触发了该方法),此时G1已激活,代码会进入else if分支,关闭G1并激活G2。
最终G1短暂激活后又被关闭,肉眼看起来像是同时激活了G1和G2。
另外,依赖G1.activeInHierarchy作为判断条件不够可靠,若有其他代码修改G1的激活状态,会直接打乱逻辑。
修复方案
用独立的状态变量跟踪切换步骤,避免依赖对象的激活状态:
private int toggleState = 0; // 0:初始状态, 1:G1激活, 2:G2激活 void OnTriggerStay(Collider player) { if (player.CompareTag("Player")) // 比直接访问tag更高效 { if (Input.GetKeyDown(KeyCode.G)) // 用枚举比字符串更可靠 { switch(toggleState) { case 0: G1.SetActive(true); toggleState = 1; break; case 1: G1.SetActive(false); G2.SetActive(true); toggleState = 2; break; // 可选:需要循环切换可添加以下逻辑 // case 2: // G2.SetActive(false); // toggleState = 0; // break; } } } }
额外优化
- 用
player.CompareTag("Player")替代player.gameObject.tag == "Player",避免空引用检查,性能更优; - 用
KeyCode.G替代字符串"g",减少解析开销,避免拼写/大小写错误; - 确保G1和G2初始状态为未激活,匹配预期流程。
内容的提问来源于stack exchange,提问作者Carl
相关产品推荐
相关产品推荐

