Unity2D跳跃不一致

我正在修补unity2D sidescroller,并试图让玩家控制器跳。 然而,当我告诉我的角色跳跃时,它有时会跳跃两倍的距离,我不知道为什么。 以下是我的控制器脚本:

using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerMovement : MonoBehaviour { public float playerSpeed = 10; public float jumpForce = 20; private bool ableToJump = false; public GameObject groundCheck; // place an empty object slightly below the character where it will collide with any ground // Update is called once per frame void Update() { if (Input.GetKey("space") && ableToJump) { ableToJump = !ableToJump; GetComponent<Rigidbody2D>().AddForce(new Vector3(0,1,0) * jumpForce); } if (Input.GetKey("a")) { transform.Translate(-playerSpeed * Time.deltaTime, 0, 0); } if (Input.GetKey("d")) { transform.Translate(playerSpeed * Time.deltaTime, 0, 0); } // The player is grounded if a linecast to the groundcheck position hits anything on the ground layer. ableToJump = Physics2D.Linecast(transform.position, groundCheck.transform.position, 1 << LayerMask.NameToLayer("Wall")); } } 

这是我在预览游戏时出现的小故障(请注意第三次跳跃看起来如何高出两倍)。 发生的时间没有一致性,但是它发生的时间是在连续两次之间的任何时间发生的。 我已经尝试了很长的时间与短暂的按下跳跃键(空格键),移动与静止,跳跃在不同的位置。 我也尝试禁用animation和等待之间的压力与按住空间,与快速按空间。 唯一一样的情况是,有时候我会跳三块(200 x 200像素),有时我会跳高六块。 任何提示都表示赞赏。 谢谢!

行动中的小故障

我建议改变Input.GetKey("space") Input.GetKeyDown("space") 。 这样,检查仅在初始按键时执行,而不是每隔一个空格键。


另一个问题是在脚本的底部: ableToJump = Physics2D.Linecast(...

由于物理步骤(也称为固定时间步长)每2毫秒(默认情况下)更新,而不是每个更新帧,因此Rigidbody.velocity更改(以及后续的Rigidbody.position更改)可能不会立即发生。 因此,检查Update的地面位置可能不是100%准确的,直到物理步骤发生并应用您的AddForce调用。

我建议:

  1. ableToJump = Physics2D.Linecast(...行移动到Update方法的顶部,以便执行跳转之前检查地面的顺序;或者

  2. ableToJump = Physics2D.Linecast(...行移动到FixedUpdate () { }方法中,使其与物理步骤同步并保持真实(请注意,如果您要改变transform.position而不是Rigidbody.position ,所以也许使用第一个选项。)