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 FixedUpdate
en Update
niet 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 Settings
en Active Input Handling
moeten worden ingesteld op Input Manager (Old)
(of Both
werken 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;