Unity-input.getkeyDown (keycode.space) niet op de detecteren van de toets Druk op

Ik ben eenheid aan het leren, maar mijn sleutelpers wordt niet gedetecteerd

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

Waarom wordt het altijd vals. Wat doe ik verkeerd? Van wat ik begrijp dat dit zou moeten werken, maar ik mis duidelijk iets

Update:
Dank aan iedereen die ideeën voorstelde. Ik kreeg het isjumppressed om het waar te maken toen ik stopte met proberen de spatiebalk te detecteren.

isJumpPressed = Input.GetKeyDown("a");

Iedereen heeft ideeën gewerkt waarom dit zou werken en niet

isJumpPressed = Input.GetKeyDown(KeyCode.Space);

of

isJumpPressed = Input.GetKeyDown("space");

Update 2:
Blijkbaar is dit een bug in Linux. Ik heb gelezen dat dit niet gebeurt als de game alleen in de editor is gebouwd. Ik heb een oplossing gevonden op
https://forum .unity.com/threads/space-not-working.946974/?_ga=2.25366461.1247665695.1598713842-86850982.1598713842#post-6188199

Als een Googler dit probleem tegenkomt, verwijs dan naar de volgende code, want dit werkt voor mij.

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

Antwoord 1, autoriteit 100%

Het probleem is dat FixedUpdateen Updateniet achter elkaar worden aangeroepen. Update wordt eenmaal per frame aangeroepen en FixedUpdate wordt eenmaal per physics-update aangeroepen (standaard is 50 updates per seconde).

Dus het volgende kan gebeuren:

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 

Hier is een voorbeeld waarbij ‘Update Jump’ wordt afgedrukt telkens wanneer u op de spatiebalk drukt, en ‘FixedUpdate Jump’ alleen soms wanneer u op de spatiebalk drukt. Doe dit niet:

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

Doe dit in plaats daarvan:

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

Antwoord 2, autoriteit 100%

Een mogelijk probleem is dat uw project mogelijk gebruikmaakt van het nieuwe Invoersysteempakket. Als u dit pakket gebruikt, werken de oude Input Manager-functies niet. Om dit te controleren, ga naar Edit > Project Settings... > Player > Other Settingsen Active Input Handlingmoeten worden ingesteld op Input Manager (Old)(of Bothwerken mogelijk ook).

Als u het Input System-pakket daadwerkelijk wilt gebruiken, moet u installeerhet als je het nog niet hebt, en je zou controleren of de spatiebalk als volgt is ingedrukt:

using UnityEngine.InputSystem;
...
jumpPressed = Keyboard.current.space.wasPressedThisFrame;

Other episodes