You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 17:06:03