unity3d 输入.GetKeyDown无法正常工作Unity 2D

tcbh2hod  于 2022-11-16  发布在  其他
关注(0)|答案(2)|浏览(465)

我尝试在Unity 2D中按Space按钮时进行方块跳跃。我有以下代码:

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函数。它可以工作,但是如果我一直按空格键,这个函数就会让我的方块一直向上。

1bqhqjot

1bqhqjot1#

当你调用AddForce()方法时,你不必乘以“Time.deltaTime”。
您可以执行以下操作:
首先缓存Start()方法中的“Rigidbody2D”组件,因为如果在每一帧都调用它,将影响游戏性能。

private Rigidbody2D rigidbody2D;

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

第二,您应该调用FixedUpdate()方法,而不是Update()方法,这是处理物理时推荐的方法

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.upVector2(0, 1)的简写
您可以在此处阅读更多有关Vector2的信息Vector2.up Unity's Documentation

vwkv1x7d

vwkv1x7d2#

你需要给jumpforce赋值,当然也要给moveforce赋值。如果你不想重复跳跃,就给你的bool赋值,检查你是否在地面上。我用我的”private bool = isGrounded”。试试下面的代码。它使你的跳跃成为一个接触地面的函数。

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

}

当你跳的时候,它使你的布尔变量为假,当你接触地面的时候,它使你的布尔变量为真。确保“地面”必须和你的地面的标签完全一样。

相关问题