Input.GetKeyDown 无法正常工作 Unity 2D



当我按下空格键时,我试图在Unity 2D中让我的方形跳跃。我有以下代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Movement : MonoBehaviour
{
public float moveSpeed;
public float jumpSpeed;
float moveX;
Vector2 pos;
// Update is called once per frame
void Update()
{
MoveHorizontally();
Jump();
}
void MoveHorizontally(){
moveX = Input.GetAxis("Horizontal") * Time.deltaTime;
pos.x = moveX * moveSpeed;
transform.position = new Vector2(transform.position.x + pos.x,transform.position.y + pos.y);
}
void Jump(){
if (Input.GetKeyDown("space")){
GetComponent<Rigidbody2D>().AddForce(new Vector2(0,jumpSpeed * Time.deltaTime), ForceMode2D.Impulse);
Debug.Log("Jumped!");
}
}
}

当我按下空格键时,会出现"跳跃!"消息,但我的方块没有跳跃。知道吗?

多谢。

我尝试使用Input.GetKey函数。它有效,但是如果我继续按住空格键,该功能会不断使我的正方形向上移动。

您需要为跳跃力断一个值。 当然还有移动力。 如果你不想反复跳跃 只需命名一个布尔值即可检查您是否在地面上。我使用我的作为"私人布尔值 = 是接地的"。 并尝试下面的代码。它使您的跳跃成为接触地面的条件。

private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("Ground")) 
isGrounded = true;

}

这是我的跳转代码。

public void PlayerJump() {
if (Input.GetButtonDown("Jump") && isGrounded) {
isGrounded = false;
myBody.AddForce(new Vector2(0f, jumpForce), ForceMode2D.Impulse);
}
}

每当你跳跃时,它都会让你的布尔变体为假,而每当你接触地面时,它就会让你的布尔值为真。 确保"地面"必须与您的地面标签完全相同。

当你调用AddForce()方法时,你不必乘以"Time.deltaTime"。

您可以执行以下操作:

首先从Start()方法缓存"Rigidbody2D"组件,因为如果您每帧都调用它,它会影响您的游戏性能。

private Rigidbody2D rigidbody2D;
void Start()
{
rigidbody2D = GetComponent<Rigidbody2D>();
}

其次,与其使用Update()方法,不如调用FixedUpdate()方法,这是在处理物理时推荐

void FixedUpdate()
{
MoveHorizontally();
Jump();
}

第三,在我上面说的Jump()方法上,您不应该将跳跃力乘以Time.deltaTime,而是执行以下操作:

public float jumpForce = 10f;
public void Jump() 
{
if (Input.GetKeyDown(KeyCode.Space)) 
{
rigidbody2D.AddForce(Vector2.up*jumpForce);
}
}

您可以根据需要调整jumpForce。 此外,Vector2.up是书写Vector2(0, 1)的简写

您可以在此处阅读有关Vector2的更多信息 Vector2.up Unity的文档

最新更新