Unity Input.GetKeyDown (KeyCode.Space) ne détecte pas la touche Appuyez sur

Aug 30 2020

J'apprends Unity mais mon appui sur une touche n'est pas détecté

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

}  

pourquoi isJumpPressed est toujours faux. Qu'est-ce que je fais mal? D'après ce que je comprends, cela devrait fonctionner mais il me manque évidemment quelque chose

MISE À JOUR: Merci à tous ceux qui ont proposé des idées. J'ai eu le isJumpPressed pour retourner true lorsque j'ai arrêté d'essayer de détecter la barre d'espace.

isJumpPressed = Input.GetKeyDown("a");

n'importe qui a des idées pourquoi cela fonctionnerait et non

isJumpPressed = Input.GetKeyDown(KeyCode.Space);

ou

isJumpPressed = Input.GetKeyDown("space");

MISE À JOUR 2: Apparemment, c'est un bogue sous Linux. J'ai lu que cela n'arrivera pas lorsque le jeu est construit uniquement dans l'éditeur. J'ai trouvé une solution de contournement àhttps://forum.unity.com/threads/space-not-working.946974/?_ga=2.25366461.1247665695.1598713842-86850982.1598713842#post-6188199

Si un Googler tombe sur ce problème, faites référence au code suivant, car cela fonctionne pour moi.

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

} 

Réponses

2 Pluto Aug 30 2020 at 00:18

Le problème est que FixedUpdateet Updatene sont pas appelés les uns après les autres. La mise à jour est appelée une fois par image et FixedUpdate est appelée une fois par mise à jour physique (la valeur par défaut est de 50 mises à jour par seconde).

Ainsi, ce qui suit pourrait arriver:

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 

Voici un exemple qui imprime "Update Jump" chaque fois que vous appuyez sur espace, et "FixedUpdate Jump" seulement parfois lorsque vous appuyez sur espace. Ne faites pas cela:

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

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

Faites ceci à la place:

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 problème possible est que votre projet utilise peut-être le nouveau package Input System . Si vous utilisez ce package, les anciennes fonctions Input Manager ne fonctionneront pas. Pour vérifier cela, accédez à Edit > Project Settings... > Player > Other Settingset Active Input Handlingdoit être défini sur Input Manager (Old)(ou Bothpeut également fonctionner).

Si vous souhaitez réellement utiliser le package Input System, vous devez l' installer si vous ne l'avez pas déjà, et vous devriez vérifier si la barre d'espace est enfoncée comme suit:

using UnityEngine.InputSystem;

...

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

Consultez les documents ici: https://docs.unity3d.com/ScriptReference/Input.GetKeyDown.html

Renvoie true pendant que l'utilisateur commence à appuyer sur la touche identifiée par son nom.

Vous devez appeler cette fonction à partir de la fonction de mise à jour, car l'état est réinitialisé à chaque image. Il ne retournera pas vrai tant que l'utilisateur n'aura pas relâché la touche et appuyé à nouveau dessus.

Utilisez la GetKeyfonction à la place:https://docs.unity3d.com/ScriptReference/Input.GetKey.html

Renvoie true pendant que l'utilisateur maintient la clé identifiée par son nom.