Unity Input.GetKeyDown (KeyCode.Space) tidak mendeteksi tombol Tekan

Aug 30 2020

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

2 Pluto Aug 30 2020 at 00:18

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;
    }
}
2 EricPendergast Aug 30 2020 at 01:35

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;
AthanasiosKataras Aug 29 2020 at 23:04

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.