Unity Input.GetKeyDown (KeyCode.Space) non rileva la pressione del tasto

Aug 30 2020

Sto imparando Unity ma la mia pressione dei tasti non viene rilevata

    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;
            }
        }
    }

}  

perché isJumpPressed è sempre falso. Che cosa sto facendo di sbagliato? Da quello che ho capito dovrebbe funzionare, ma ovviamente mi manca qualcosa

AGGIORNAMENTO: Grazie a tutti coloro che hanno proposto idee. Ho ottenuto isJumpPressed per restituire true quando ho smesso di provare a rilevare la barra spaziatrice.

isJumpPressed = Input.GetKeyDown("a");

qualcuno ha un'idea del perché questo dovrebbe funzionare e no

isJumpPressed = Input.GetKeyDown(KeyCode.Space);

o

isJumpPressed = Input.GetKeyDown("space");

AGGIORNAMENTO 2: Apparentemente questo è un bug in Linux. Ho letto che non succederà quando il gioco viene creato solo nell'editor. Ho trovato una soluzione alternativa ahttps://forum.unity.com/threads/space-not-working.946974/?_ga=2.25366461.1247665695.1598713842-86850982.1598713842#post-6188199

Se un googler si imbatte in questo problema, fai riferimento al codice seguente perché per me funziona.

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;
    }

} 

Risposte

2 Pluto Aug 30 2020 at 00:18

Il problema è quello FixedUpdatee Updatenon vengono chiamati uno dopo l'altro. L'aggiornamento viene chiamato una volta per frame e FixedUpdate viene chiamato una volta per aggiornamento fisico (l'impostazione predefinita è 50 aggiornamenti al secondo).

Quindi potrebbe accadere quanto segue:

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 

Di seguito è riportato un esempio che stampa "Salto di aggiornamento" ogni volta che si preme la barra spaziatrice e "Salto di aggiornamento fisso" solo a volte quando si preme lo spazio. Non farlo:

bool isJumpPressed;
void Update()
{
    isJumpPressed = Input.GetKeyDown(KeyCode.Space);
    if (isJumpPressed)
    {            
        Debug.Log("Update Jump");
    }       
}

private void FixedUpdate()
{
    if (isJumpPressed)
    {
        Debug.Log("FixedUpdate Jump");            
    }
}

Fai questo invece:

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

Un possibile problema è che il tuo progetto potrebbe utilizzare il nuovo pacchetto Input System . Se stai usando questo pacchetto, le vecchie funzioni di Input Manager non funzioneranno. Per verificarlo, vai su Edit > Project Settings... > Player > Other Settingse Active Input Handlingdovrebbe essere impostato su Input Manager (Old)(o Bothpotrebbe anche funzionare).

Se in realtà vuoi usare il pacchetto Input System, devi installarlo se non lo hai già, e dovresti controllare se la barra spaziatrice è premuta in questo modo:

using UnityEngine.InputSystem;

...

jumpPressed = Keyboard.current.space.wasPressedThisFrame;
AthanasiosKataras Aug 29 2020 at 23:04

Controlla i documenti qui: https://docs.unity3d.com/ScriptReference/Input.GetKeyDown.html

Restituisce vero durante il frame in cui l'utente inizia a premere il tasto identificato dal nome.

È necessario chiamare questa funzione dalla funzione Update, poiché lo stato viene ripristinato ogni frame. Non tornerà vero finché l'utente non avrà rilasciato il tasto e lo avrà premuto di nuovo.

Usa la GetKeyfunzione invece:https://docs.unity3d.com/ScriptReference/Input.GetKey.html

Restituisce vero mentre l'utente tiene premuta la chiave identificata dal nome.