[英]Unity 2d player jumping infinitely
我是 Unity 新手,这是我的第一款游戏,但我的玩家在无限跳跃,我看了很多教程,但仍然不知道如何解决它。
这是我的代码
public float moveSpeed = 5f;
void Update()
{
Jump();
Vector3 movement = new Vector3(Input.GetAxis("Horizontal"), 0f, 0f);
transform.position += movement * Time.deltaTime * moveSpeed;
Vector3 characterScale = transform.localScale;
if (Input.GetAxis("Horizontal") < 0)
{
characterScale.x = 1;
}
if (Input.GetAxis("Horizontal") > 0)
{
characterScale.x = -1;
}
transform.localScale = characterScale;
}
void Jump()
{
if (Input.GetButtonDown("Jump"))
{
gameObject.GetComponent<Rigidbody2D>().AddForce(new Vector2(0f, 15f), ForceMode2D.Impulse);
}
}
}
你有几样东西。 首先你有Input.GetButtonDown("Jump")
这意味着当玩家按住按钮时,它将在 if 语句中执行该脚本,这将施加一个力。 因此,当玩家按住按钮时,它将运行每一帧和每一帧,它将施加该力。 您可以尝试执行Input.GetButtonUp("Jump")
当玩家让按钮的 go 时,这将是正确的,然后它将施加该力。 现在,如果那是您想要的感觉,您可以保持GetButtonDown
没问题。
但真正的问题是,第二个问题是,您需要检查玩家是否接触地面。 如果他接触地面,那么您可以施加该力。 如果他没有接触地面,则不要施加力。
go 有几种方法可以解决这个问题,最简单的方法是创建一个新层并将其命名为接地或其他东西。
您单击该下拉菜单并单击添加图层。然后您可以添加一个图层,然后将 go 回到地面游戏对象并将该图层分配给该图层。 现在假设地面上有一个对撞机,所以玩家不会 go 穿过它。
之后,您需要对玩家对撞机的引用。 在Start()
方法中,您可以添加以下内容:
private Collider2D myCollider;
void Start()
{
// This will get a reference to the collider 2d on the player
myCollider = GetComponent<Collider2D>();
}
void Update()
{
.
.
.
// This means the player is touching the ground layer.
if (myCollider.IsTouchingLayers(LayerMask.GetMask("Ground")))
{
if (Input.GetButtonDown("Jump"))
{
gameObject.GetComponent<Rigidbody2D>().AddForce(new Vector2(0f, 15f), ForceMode2D.Impulse);
}
}
}
所以这个脚本做了什么,它获取了玩家对撞机的引用,然后检查玩家对撞机是否接触到地面层。 地面也需要有一个碰撞器,不仅是为了防止玩家从关卡中掉下来,还要触发这个 boolean 的真假。 如果它们相互接触,则为真,如果不接触,则为假。 因此,如果他们没有接触地面,那么无论玩家按下该按钮多少次,他都不会跳跃。 一旦他们这样做了,如果他们按下跳跃,它就会施加跳跃力。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.