如何正确实现PS1风格3D平台游戏类马里奥可变高度跳跃功能
问题排查与修复方案
现有代码存在以下核心问题,导致无法实现分段跳跃效果:
- 地面检测仅在
Start()中执行一次,后续不会更新isgrounded状态,跳跃状态判断完全失效 jumping()方法仅在按下跳跃键的瞬间触发一次,长按跳跃键的逻辑没有持续检测的入口- 输入检测逻辑错误:
Input.GetButtonDown()仅在按键按下的第一帧返回true,判断是否持续按住按键需要使用Input.GetButton() - 重力逻辑冲突:自行定义了gravity变量,但没有关闭Rigidbody自带的重力,同时计算起跳速度时直接把gravity乘到jumpPower上,逻辑混乱导致跳跃表现异常
- 没有最大跳跃时长限制,无法控制长按的最高高度上限
修正后的完整代码
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Move : MonoBehaviour { [Header("Movement Things")] [Min(1)] public int characterSpeed = 1; [Min(2.5f)] public float jumpPower = 5.0f; [Min(0.05f)] public float gravity = 2.5f; [Header("Jump Settings")] [Min(0.1f)] public float maxJumpHoldTime = 0.3f; [Min(0.1f)] public float groundCheckDistance = 0.5f; private Rigidbody character; private bool isgrounded; private float currentJumpHoldTime; private bool isJumping; void Start() { character = GetComponent<Rigidbody>(); // 关闭Rigidbody自带重力,自行控制下落逻辑避免干扰 character.useGravity = false; } private void FixedUpdate() { // 每帧更新地面检测状态 isgrounded = Physics.Raycast(transform.position, Vector3.down, groundCheckDistance); // 处理水平移动 Vector3 moveDir = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")) * characterSpeed; character.velocity = new Vector3(moveDir.x, character.velocity.y, moveDir.z); // 起跳触发逻辑 if (isgrounded && Input.GetButtonDown("Jump")) { isJumping = true; currentJumpHoldTime = 0; character.velocity = new Vector3(character.velocity.x, jumpPower, character.velocity.z); } // 长按跳跃提升高度逻辑 if (isJumping && Input.GetButton("Jump")) { if (currentJumpHoldTime < maxJumpHoldTime) { character.velocity = new Vector3(character.velocity.x, jumpPower, character.velocity.z); currentJumpHoldTime += Time.fixedDeltaTime; } else { isJumping = false; } } // 松开跳跃键直接终止上升 if (Input.GetButtonUp("Jump")) { isJumping = false; } // 非起跳状态下应用重力 if (!isgrounded && !isJumping) { character.velocity -= new Vector3(0, gravity * Time.fixedDeltaTime, 0); } } }
调参说明
- 调整
maxJumpHoldTime参数控制最长按住跳跃的时间,建议设置在0.2f~0.4f区间,数值越大可跳跃的最高高度越高 - 注意在Inspector面板中关闭Rigidbody组件的
Use Gravity选项,避免物理引擎自带重力干扰自定义逻辑 - 测试时可根据手感调整
jumpPower和gravity数值,直到符合你想要的PS1复古平台跳跃手感
内容的提问来源于stack exchange,提问作者JBmodelHopper
相关产品推荐
相关产品推荐

