如何在2D统一中停止无限跳跃



所以我昨天开始了团结,这意味着这是我的第二天。我按照教程做了一个动作脚本,但当我不断按下空格时,我可以像无限跳跃一样。这是我下面的代码,有没有办法将无限跳跃固定为两次跳跃,然后在落地时重置?

using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
[SerializeField] private float speed;
private Rigidbody2D body;

private void Awake()
{
body = GetComponent<Rigidbody2D>();
}
private void Update()
{
body.velocity = new Vector2(Input.GetAxis("Horizontal") * speed, body.velocity.y);
if (Input.GetKey(KeyCode.Space))
body.velocity = new Vector2(body.velocity.x, speed);
}
}

您可以通过添加时间延迟来防止这种情况

using UnityEngine;
public class PlayerMovement : MonoBehaviour {

[SerializeField] private float speed;
[SerializeField] private float jumpTimeDelay = 0.5f; // feel free to increase or decrease
private const float timeDelayConst = jumpTimeDelay;
private bool isGrounded = false;
private Rigidbody2D body;

private void Awake() {
body = GetComponent<Rigidbody2D>();
}
private void Update(){
body.velocity = new Vector2(Input.GetAxis("Horizontal") * speed, 
body.velocity.y);

isGrounded = jumpTimeDelay <= 0;
jumpTimeDelay -= Time.time;            
if (Input.GetKey(KeyCode.Space) && isGrounded){
body.velocity = new Vector2(body.velocity.x, speed);
jumpTimeDelay = timeDelayConst;
}
}
}

这很容易做到,只需添加一个布尔值来检查玩家是否停飞,并在玩家跳跃时更改值。你还需要在你的地面物体上添加一个标签,这样我们就可以检查玩家是否接触到了地面。要向对象添加标签,请参阅Unity-手册:https://docs.unity3d.com/530/Documentation/Manual/Tags.html

只是为了将来,这类问题会被问很多,所以你几乎可以在谷歌上搜索你的问题,找到类似的答案。

public class PlayerMovement : MonoBehaviour
{
[SerializeField] private float speed;
private Rigidbody2D body;

private bool isGrounded = true;

private void Awake()
{
body = GetComponent<Rigidbody2D>();
}
private void Update()
{
body.velocity = new Vector2(Input.GetAxis("Horizontal") * speed, body.velocity.y);
if(Input.GetKey(KeyCode.Space))
{
if (isGrounded)
{
isGrounded = false;
body.velocity = new Vector2(body.velocity.x, speed);
}
}
}
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.tag == "Ground") {
isGrounded = true;
}
}
}

最新更新