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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 22:55:18