当我按下空格键时,我试图在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的文档