Unity Input.GetKeyDown (KeyCode.Space) ne détecte pas la touche Appuyez sur
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
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;
}
}
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;
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.