Unity中跳跃功能异常求助:角色随机跳得更高
Unity跳跃高度随机异常的解决方法
问题根源
你当前代码里用了Input.GetKey(jumpKey),这个API在按住按键的每帧都会返回true。如果jumpCooldown时长较短,或者角色落地瞬间readyToJump刚好重置完成,按住空格的情况下会重复触发跳跃逻辑,叠加跳跃力,导致角色跳得比预期高。另外如果isGrounded的落地检测逻辑不严谨,也可能出现误触发的情况。
修复方案
1. 替换输入检测API
把Input.GetKey改成Input.GetKeyDown,这个API只在按键按下的第一帧返回true,从根源避免重复触发跳跃:
private void Jump() { // 仅在按键按下的第一帧触发跳跃 if (Input.GetKeyDown(jumpKey) && readyToJump && isGrounded) { readyToJump = false; isGrounded = false; // 主动标记为未落地,避免落地前误判 // 重置Y轴速度,防止下落时的速度影响跳跃高度 rb.velocity = new Vector3(rb.velocity.x, 0f, rb.velocity.z); // 添加跳跃力 rb.AddForce(transform.up * jumpForce, ForceMode.Impulse); Invoke(nameof(ResetJump), jumpCooldown); } } private void ResetJump() { readyToJump = true; }
2. 优化落地检测逻辑
确保isGrounded只有在角色确实接触地面时才为true,比如用短射线从角色底部向下检测:
[SerializeField] private float groundCheckDistance = 0.1f; [SerializeField] private LayerMask groundLayer; private void Update() { // 从角色Collider底部发射射线检测地面 isGrounded = Physics.Raycast(transform.position, Vector3.down, groundCheckDistance, groundLayer); Jump(); }
(注意要给地面设置对应的Layer,并且确保角色的Collider和地面的Collider都正确设置)
3. 调整冷却时间
确保jumpCooldown的时长足够覆盖跳跃的空中阶段,避免在角色落地前就重置readyToJump。
内容的提问来源于stack exchange,提问作者user22757387
相关产品推荐
相关产品推荐

