我正在制作一个手电筒机制,当按下'F'时打开灯,当再次按下'F'时关闭灯。
然而,当我按下按钮时,它注册了两次。我已经记录了这个输出,手电筒同时打开和关闭。
我知道我一定是做错了什么。解决这个问题的最好办法是什么?下面是我的代码:using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Flashlight : MonoBehaviour
{
public GameObject flashlight;
public bool lightIsOn;
void Start()
{
lightIsOn = false;
}
void Update()
{
if (lightIsOn == false)
{
if (Input.GetKey(KeyCode.F))
{
flashlight.SetActive(true);
lightIsOn = true;
Debug.Log("flashlight is on");
}
}
if (lightIsOn == true)
{
if (Input.GetKey(KeyCode.F))
{
flashlight.SetActive(false);
lightIsOn = false;
Debug.Log("Flashlight is off");
}
}
}
}
private bool lightIsOn = false;
void Update()
{
if (Input.GetKeyDown(KeyCode.F))
{
lightIsOn = !lightIsOn;
flashlight.SetActive(lightIsOn );
Debug.Log("flashlight is " + lightIsOn);
}
}
}
只要在按下时恢复lightIsOn bool。另外,使用GetKeyDown,这样当你按
时它只调用一次fafase的回答是推荐的方法,但是要解释为什么您的原始代码似乎运行两次是因为您在那里有两个if
语句而不是if-else
语句。
当函数启动时,lightIsOn
等于false
,然后点击您的第一个if
语句检查它是否为false
,因此它运行设置lightIsOn
为true
内的代码。然而,无论如何,它会点击它下面的下一个if语句,检查lightIsOn
是否为true
,然后立即将其更改回false
。您的代码将工作与这个微小的变化:
void Update()
{
if (lightIsOn == false)
{
if (Input.GetKey(KeyCode.F))
{
flashlight.SetActive(true);
lightIsOn = true;
Debug.Log("flashlight is on");
}
}
else if (lightIsOn == true)
{
if (Input.GetKey(KeyCode.F))
{
flashlight.SetActive(false);
lightIsOn = false;
Debug.Log("Flashlight is off");
}
}
}
因为它只运行其中一个条件。这里的区别在于代码被告知"做这个或这个",而不是"做这个和这个"。但我还是建议采用fafase的答案,原因已经给出了。