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

Unity开发中按键触发两次导致手电筒开关逻辑异常如何解决

问题根因

Input.GetKey()的触发逻辑是:只要对应按键处于按住状态,运行期间每一帧都会返回true。
原有代码是顺序执行结构:同一帧内首先检测到F键按住、当前灯为关闭状态,就执行开灯逻辑、把lightIsOn设为true;紧接着执行第二段判断时,lightIsOn已经被修改为true,再次检测到F键按住的状态,立刻执行关灯逻辑、把lightIsOn设回false,最终表现就是单次按键同时触发开、关操作,手电筒状态没有按预期切换。

最优修复方案

核心修改是把Input.GetKey()替换为Input.GetKeyDown(),该API仅在按键按下的第一帧返回一次true,按住按键期间不会重复触发,同时可以简化冗余的分支判断,降低逻辑出错概率:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Flashlight : MonoBehaviour
{
    public GameObject flashlight;
    public bool lightIsOn;

    void Start()
    {
        lightIsOn = false;
        flashlight.SetActive(lightIsOn);
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.F))
        {
            lightIsOn = !lightIsOn;
            flashlight.SetActive(lightIsOn);
            Debug.Log(lightIsOn ? "flashlight is on" : "Flashlight is off");
        }
    }
}

优化说明

  • 从输入检测层面解决重复触发问题:GetKeyDown保证单次按键按下只会触发一次状态切换,不会因为逐帧检测导致单帧内多次执行逻辑
  • 移除冗余的双层分支判断,通过布尔值取反直接切换开关状态,代码更简洁易维护
  • 初始化阶段同步手电筒物体激活状态和控制变量,避免场景初始配置和代码逻辑不一致的问题

内容的提问来源于stack exchange,提问作者BeardedArtist

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 08:01:04