unity3d Unity输入.GetKeyDown(键码.空格)未检测到按键

9bfwbjaz  于 2023-01-31  发布在  其他
关注(0)|答案(3)|浏览(476)

我正在学习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;
            }
        }
    }

}

为什么JumpPressed总是false?我做错了什么?据我所知,这应该可以工作,但我显然遗漏了一些东西
更新:感谢每一个提出想法的人。当我停止尝试检测空格键时,我得到了isjumppressed返回true。

isJumpPressed = Input.GetKeyDown("a");

有人知道为什么这会成功吗

isJumpPressed = Input.GetKeyDown(KeyCode.Space);

isJumpPressed = Input.GetKeyDown("space");

更新2:显然这是Linux的一个错误。我听说当游戏只是在编辑器中构建时,它不会发生。我在www.example.com上找到了一个解决方法https://forum.unity.com/threads/space-not-working.946974/?_ga=2.25366461.1247665695.1598713842-86850982.1598713842#post-6188199
如果任何谷歌的绊倒在这个问题上参考以下代码,因为这是为我工作。

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

}
afdcj2ne

afdcj2ne1#

问题是FixedUpdateUpdate不是一个接一个地被调用,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

下面是一个例子,它会在每次按空格键时打印"更新跳转",而只有在按空格键时才打印"固定更新跳转"。

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

1qczuiv02#

一个可能的问题是您的项目可能使用了新的Input System包。如果您正在使用这个包,旧的Input Manager函数将无法工作。要检查这个问题,请转到Edit > Project Settings... > Player > Other SettingsActive Input Handling应该设置为Input Manager (Old)(或者Both也可能工作)。
如果你真的想使用Input System软件包,你必须install它,如果你还没有它,你会检查空格键是否按下,如下所示:

using UnityEngine.InputSystem;

...

jumpPressed = Keyboard.current.space.wasPressedThisFrame;
w51jfk4q

w51jfk4q3#

我也有同样的问题。花了几个小时试图弄清楚。也许从一开始到我弄清楚之前一切都很好。当你我执行播放来查看结果和测试移动时,错误地选择了场景标签。如果我想看到结果(播放),我必须点击“游戏标签”。在游戏标签中检测到了按键。enter image description here

相关问题