Unity Input.GetKeyDown (KeyCode.Space) не обнаруживает клавишу Нажмите
Я изучаю Unity, но нажатие клавиши не распознается
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;
}
}
}
}
почему isJumpPressed всегда ложно. Что я делаю неправильно? Насколько я понимаю, это должно работать, но мне явно чего-то не хватает
ОБНОВЛЕНИЕ: Спасибо всем, кто предложил идеи. Я получил isJumpPressed, чтобы вернуть истину, когда я перестал пытаться обнаружить пробел.
isJumpPressed = Input.GetKeyDown("a");
у кого-то есть идеи, почему это сработает, а не
isJumpPressed = Input.GetKeyDown(KeyCode.Space);
или же
isJumpPressed = Input.GetKeyDown("space");
ОБНОВЛЕНИЕ 2: По-видимому, это ошибка в Linux. Я читал, что этого не произойдет, если игра будет собрана только в редакторе. Я нашел обходной путь вhttps://forum.unity.com/threads/space-not-working.946974/?_ga=2.25366461.1247665695.1598713842-86850982.1598713842#post-6188199
Если какой-либо Googler столкнется с этой проблемой, обратитесь к следующему коду, потому что он работает для меня.
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;
}
}
Ответы
Проблема в том, что FixedUpdateи Updateне вызываются друг за другом. Обновление вызывается один раз за кадр, а FixedUpdate вызывается один раз за обновление физики (по умолчанию 50 обновлений в секунду).
Так могло произойти следующее:
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
Вот пример, который печатает «Update Jump» каждый раз, когда вы нажимаете пробел, а «FixedUpdate Jump» только иногда, когда вы нажимаете пробел. Не делай этого:
bool isJumpPressed;
void Update()
{
isJumpPressed = Input.GetKeyDown(KeyCode.Space);
if (isJumpPressed)
{
Debug.Log("Update Jump");
}
}
private void FixedUpdate()
{
if (isJumpPressed)
{
Debug.Log("FixedUpdate Jump");
}
}
Вместо этого сделайте это:
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;
}
}
Одна из возможных проблем заключается в том, что ваш проект может использовать новый пакет системы ввода . Если вы используете этот пакет, старые функции диспетчера ввода работать не будут. Чтобы проверить это, перейдите к Edit > Project Settings... > Player > Other Settingsи Active Input Handlingдолжно быть установлено значение Input Manager (Old)(или Bothможет также работать).
Если вы действительно хотите использовать пакет системы ввода, вам необходимо установить его, если у вас его еще нет, и вы должны проверить, нажата ли клавиша пробела следующим образом:
using UnityEngine.InputSystem;
...
jumpPressed = Keyboard.current.space.wasPressedThisFrame;
Проверьте документы здесь: https://docs.unity3d.com/ScriptReference/Input.GetKeyDown.html
Возвращает истину, когда пользователь начинает нажимать клавишу, обозначенную именем.
Вам нужно вызвать эту функцию из функции обновления, поскольку состояние сбрасывается каждый кадр. Он не вернет true, пока пользователь не отпустит клавишу и не нажмет ее снова.
Используйте GetKeyфункцию вместо:https://docs.unity3d.com/ScriptReference/Input.GetKey.html
Возвращает истину, пока пользователь удерживает ключ, указанный по имени.