Unity Input.GetKeyDown (KeyCode.Space) tidak mendeteksi tombol Tekan
Saya mempelajari Unity tetapi penekanan tombol saya tidak terdeteksi
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
public Rigidbody myBody;
private float time = 0.0f;
private bool isMoving = false;
private bool isJumpPressed = false;
void Start(){
myBody = GetComponent<Rigidbody>();
}
void Update()
{
isJumpPressed = Input.GetKeyDown(KeyCode.Space);
Debug.Log(isJumpPressed);
}
void FixedUpdate(){
if(isJumpPressed){
myBody.velocity = new Vector3(0,10,0);
isMoving = true;
Debug.Log("jump");
}
if(isMoving){
time = time + Time.fixedDeltaTime;
if(time>10.0f)
{
//Debug.Log( Debug.Log(gameObject.transform.position.y + " : " + time));
time = 0.0f;
}
}
}
}
mengapa isJumpPressed selalu salah. Apa yang saya lakukan salah? Dari apa yang saya pahami, ini seharusnya berhasil tetapi saya jelas kehilangan sesuatu
PEMBARUAN: Terima kasih kepada semua orang yang mengusulkan ide. Saya mendapatkan isJumpPressed untuk mengembalikan nilai true ketika saya berhenti mencoba mendeteksi spasi.
isJumpPressed = Input.GetKeyDown("a");
ada yang tahu mengapa ini akan berhasil dan tidak
isJumpPressed = Input.GetKeyDown(KeyCode.Space);
atau
isJumpPressed = Input.GetKeyDown("space");
UPDATE 2: Rupanya ini adalah bug di Linux. Saya telah membaca itu tidak akan terjadi ketika game dibuat hanya di editor. Saya telah menemukan solusi dihttps://forum.unity.com/threads/space-not-working.946974/?_ga=2.25366461.1247665695.1598713842-86850982.1598713842#post-6188199
Jika ada Karyawan Google yang Tersandung pada masalah ini merujuk kode berikut karena ini berhasil untuk saya.
public class Player : MonoBehaviour
{
public Rigidbody myBody;
private float time = 0.0f;
private bool isMoving = false;
private bool isJumpPressed = false;
void Start(){
myBody = GetComponent<Rigidbody>();
}
void Update()
{
isJumpPressed = Input.GetKeyDown(SpacebarKey());
if(isJumpPressed)
{
Debug.Log(isJumpPressed);
}
}
void FixedUpdate(){
if(isJumpPressed){
myBody.velocity = new Vector3(0,10,0);
isMoving = true;
Debug.Log("jump");
}
if(isMoving){
time = time + Time.fixedDeltaTime;
if(time>10.0f)
{
//Debug.Log( Debug.Log(gameObject.transform.position.y + " : " + time));
time = 0.0f;
}
}
}
public static KeyCode SpacebarKey() {
if (Application.isEditor) return KeyCode.O;
else return KeyCode.Space;
}
}
Jawaban
Masalahnya adalah itu FixedUpdatedan Updatetidak dipanggil satu demi satu. Pembaruan dipanggil sekali per frame dan FixedUpdate dipanggil sekali per pembaruan fisika (defaultnya adalah 50 pembaruan per detik).
Jadi hal berikut bisa terjadi:
Update is called -> GetKeyDown is true (this frame only) -> isJumpPressed = true
Update is called -> GetKeyDown is false -> isJumpPressed = false
FixedUpdate is called -> isJumpPressed is false
Berikut adalah contoh yang mencetak "Update Jump" setiap kali Anda menekan spasi, dan "FixedUpdate Jump" hanya terkadang saat Anda menekan spasi. Jangan lakukan ini:
bool isJumpPressed;
void Update()
{
isJumpPressed = Input.GetKeyDown(KeyCode.Space);
if (isJumpPressed)
{
Debug.Log("Update Jump");
}
}
private void FixedUpdate()
{
if (isJumpPressed)
{
Debug.Log("FixedUpdate Jump");
}
}
Lakukan ini sebagai gantinya:
bool isJumpPressed;
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
isJumpPressed = true;
Debug.Log("Update Jump");
}
}
private void FixedUpdate()
{
if (isJumpPressed)
{
Debug.Log("FixedUpdate Jump");
isJumpPressed = false;
}
}
Satu masalah yang mungkin terjadi adalah proyek Anda mungkin menggunakan paket Sistem Input baru . Jika Anda menggunakan paket ini, fungsi Manajer Input lama tidak akan berfungsi. Untuk memeriksanya, buka Edit > Project Settings... > Player > Other Settingsdan Active Input Handlingharus disetel ke Input Manager (Old)(atau Bothmungkin juga berfungsi).
Jika Anda benar-benar ingin menggunakan paket Sistem Input, Anda harus menginstalnya jika Anda belum memilikinya, dan Anda akan memeriksa apakah bilah spasi ditekan seperti ini:
using UnityEngine.InputSystem;
...
jumpPressed = Keyboard.current.space.wasPressedThisFrame;
Periksa dokumennya di sini: https://docs.unity3d.com/ScriptReference/Input.GetKeyDown.html
Mengembalikan nilai true selama frame pengguna mulai menekan kunci yang diidentifikasi oleh nama.
Anda perlu memanggil fungsi ini dari fungsi Update, karena status mengatur ulang setiap frame. Ini tidak akan mengembalikan true sampai pengguna melepaskan kunci dan menekannya lagi.
Gunakan GetKeyfungsi sebagai gantinya:https://docs.unity3d.com/ScriptReference/Input.GetKey.html
Mengembalikan nilai true saat pengguna menahan kunci yang diidentifikasi oleh nama.