Unity Input.GetKeyDown (KeyCode.Space) erkennt Taste nicht Drücken Sie
Ich lerne Unity, aber mein Tastendruck wird nicht erkannt
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;
}
}
}
}
warum istJumpPressed immer falsch. Was mache ich falsch? Soweit ich weiß, sollte dies funktionieren, aber mir fehlt offensichtlich etwas
UPDATE: Vielen Dank an alle, die Ideen vorgeschlagen haben. Ich habe isJumpPressed erhalten, um true zurückzugeben, als ich aufgehört habe, die Leertaste zu erkennen.
isJumpPressed = Input.GetKeyDown("a");
Jeder hatte eine Idee, warum dies funktionieren würde und nicht
isJumpPressed = Input.GetKeyDown(KeyCode.Space);
oder
isJumpPressed = Input.GetKeyDown("space");
UPDATE 2: Anscheinend ist dies ein Fehler in Linux. Ich habe gelesen, dass es nicht passieren wird, wenn das Spiel nur im Editor erstellt wird. Ich habe eine Problemumgehung bei gefundenhttps://forum.unity.com/threads/space-not-working.946974/?_ga=2.25366461.1247665695.1598713842-86850982.1598713842#post-6188199
Wenn ein Googler über dieses Problem stolpert, verweisen Sie auf den folgenden Code, da dies für mich funktioniert.
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;
}
}
Antworten
Das Problem ist, dass FixedUpdateund Updatenicht nacheinander aufgerufen werden. Das Update wird einmal pro Frame und FixedUpdate einmal pro Physik-Update aufgerufen (Standard sind 50 Updates pro Sekunde).
Folgendes könnte also passieren:
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 ist ein Beispiel, das "Update Jump" jedes Mal druckt, wenn Sie die Leertaste drücken, und "FixedUpdate Jump" nur manchmal, wenn Sie die Leertaste drücken. Mach das nicht:
bool isJumpPressed;
void Update()
{
isJumpPressed = Input.GetKeyDown(KeyCode.Space);
if (isJumpPressed)
{
Debug.Log("Update Jump");
}
}
private void FixedUpdate()
{
if (isJumpPressed)
{
Debug.Log("FixedUpdate Jump");
}
}
Tun Sie dies stattdessen:
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;
}
}
Ein mögliches Problem besteht darin, dass Ihr Projekt möglicherweise das neue Eingabesystempaket verwendet . Wenn Sie dieses Paket verwenden, funktionieren die alten Input Manager- Funktionen nicht. Um dies zu überprüfen, gehen Sie zu Edit > Project Settings... > Player > Other Settingsund Active Input Handlingsollten eingestellt sein Input Manager (Old)(oder Bothmöglicherweise auch funktionieren).
Wenn Sie das Input System-Paket tatsächlich verwenden möchten, müssen Sie es installieren , falls Sie es noch nicht haben, und Sie würden prüfen, ob die Leertaste wie folgt gedrückt wird:
using UnityEngine.InputSystem;
...
jumpPressed = Keyboard.current.space.wasPressedThisFrame;
Überprüfen Sie die Dokumente hier: https://docs.unity3d.com/ScriptReference/Input.GetKeyDown.html
Gibt während des Frames true zurück, wenn der Benutzer die durch den Namen angegebene Taste drückt.
Sie müssen diese Funktion über die Aktualisierungsfunktion aufrufen, da der Status bei jedem Frame zurückgesetzt wird. Es wird nicht true zurückgegeben, bis der Benutzer die Taste losgelassen und erneut gedrückt hat.
Verwenden Sie stattdessen die GetKeyFunktion:https://docs.unity3d.com/ScriptReference/Input.GetKey.html
Gibt true zurück, während der Benutzer den durch den Namen identifizierten Schlüssel gedrückt hält.