我正在制作一個手電筒機械師,當按下“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");
}
}
}
}
uj5u.com熱心網友回復:
private bool lightIsOn = false;
void Update()
{
if (Input.GetKeyDown(KeyCode.F))
{
lightIsOn = !lightIsOn;
flashlight.SetActive(lightIsOn );
Debug.Log("flashlight is " lightIsOn);
}
}
}
只需在按下時恢復 lightIsOn 布林值。此外,使用 GetKeyDown 以便在您按下時只呼叫一次
uj5u.com熱心網友回復:
fafase 的回答是推薦的方法,但是要解釋為什么您的原始代碼似乎運行兩次是因為您if在那里有兩個陳述句而不是一個if-else陳述句。
當函式啟動時,lightIsOn等于false,然后它會命中您的第一if條陳述句,檢查它是否是false,因此它運行設定lightIsOn為中的代碼true。但是,它會在它下面點擊你的下一個 if 陳述句,檢查 if lightIsOnistrue并立即將其更改回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 的答案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/485846.html
