Unity Input.GetKeyDown (KeyCode.Space) não detecta a tecla Pressione

Aug 30 2020

Estou aprendendo Unity, mas meu pressionamento de tecla não está sendo detectado

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

}  

porque éJumpPressed sempre falso. O que estou fazendo errado? Pelo que entendi, isso deve funcionar, mas obviamente estou faltando alguma coisa

ATUALIZAÇÃO: Obrigado a todos que propuseram ideias. Eu fiz o isJumpPressed retornar verdadeiro quando parei de tentar detectar a barra de espaço.

isJumpPressed = Input.GetKeyDown("a");

alguém tem alguma ideia de por que isso funcionaria e não

isJumpPressed = Input.GetKeyDown(KeyCode.Space);

ou

isJumpPressed = Input.GetKeyDown("space");

ATUALIZAÇÃO 2: Aparentemente, este é um bug no Linux. Eu li que isso não vai acontecer quando o jogo for construído apenas no editor. Eu encontrei uma solução alternativa emhttps://forum.unity.com/threads/space-not-working.946974/?_ga=2.25366461.1247665695.1598713842-86850982.1598713842#post-6188199

Se algum Googler encontrar esse problema, consulte o código a seguir, porque está funcionando para mim.

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

} 

Respostas

2 Pluto Aug 30 2020 at 00:18

O problema é que FixedUpdatee Updatenão são chamados um após o outro. Update é chamado uma vez por quadro e FixedUpdate é chamado uma vez por atualização física (o padrão é 50 atualizações por segundo).

Portanto, pode acontecer o seguinte:

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 

Aqui está um exemplo que imprime "Update Jump" sempre que você pressiona espaço e "FixedUpdate Jump" apenas às vezes quando você pressiona espaço. Não faça isso:

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

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

Em vez disso:

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

Um possível problema é que seu projeto pode estar usando o novo pacote Input System . Se você estiver usando este pacote, as funções antigas do Input Manager não funcionarão. Para verificar isso, vá para Edit > Project Settings... > Player > Other Settingse Active Input Handlingdeve ser definido como Input Manager (Old)(ou Bothtambém pode funcionar).

Se você realmente deseja usar o pacote Input System, deverá instalá- lo, caso ainda não o tenha, e deverá verificar se a barra de espaço está pressionada desta forma:

using UnityEngine.InputSystem;

...

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

Verifique a documentação aqui: https://docs.unity3d.com/ScriptReference/Input.GetKeyDown.html

Retorna verdadeiro durante o frame em que o usuário começa a pressionar a tecla identificada pelo nome.

Você precisa chamar esta função a partir da função Atualizar, uma vez que o estado é redefinido a cada quadro. Não retornará verdadeiro até que o usuário solte a tecla e a pressione novamente.

Use a GetKeyfunção em vez de:https://docs.unity3d.com/ScriptReference/Input.GetKey.html

Retorna verdadeiro enquanto o usuário mantém pressionada a chave identificada por nome.