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

Unity角色无法跳跃问题求助(附PlayerMovement完整代码)

Unity 3D玩家控制器跳跃无响应问题解决

我正在制作首款Unity 3D游戏,已经实现了基础玩家控制器,除跳跃功能外其他控制均正常工作。跳跃键绑定为空格键,但按下后完全没有反应。

核心问题排查与修复

1. readyToJump变量未初始化

代码中readyToJump为布尔类型,默认值是false,但Start()方法里没有将其初始化为true,导致游戏启动后直接不满足跳跃触发条件。

修复方法:在Start()方法中添加初始化代码:

private void Start()
{
    rb = GetComponent<Rigidbody>();
    rb.freezeRotation = true;
    readyToJump = true; // 新增这一行,初始化跳跃就绪状态
}

2. 地面检测Raycast参数验证

检查以下几个关键设置:

  • playerHeight是否设置了合理数值(比如角色高度为2,该值就设为2),确保射线长度足够触碰到地面
  • whatIsGround层级遮罩是否正确选中了地面所在的Layer(不要包含角色自身的Layer)
  • 可以在Scene视图开启Gizmos,可视化Raycast的检测范围,确认射线能正确击中地面

3. 跳跃力参数设置

检查jumpForce的数值是否足够大(建议先设置为50左右测试),如果数值过小,角色可能不会出现明显的跳跃动作。

4. 输入绑定确认

虽然代码直接使用KeyCode.Space,仍需确认:

  • Player Settings的输入管理器中,空格键没有绑定到其他冲突的输入项
  • 测试时确保输入法处于英文状态,避免按键被输入法拦截

修正后的完整代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    [Header("movement")]
    public float moveSpeed;

    public float groundDrag;

    public float jumpForce;
    public float jumpCooldown;
    public float airMultiplier;
    bool readyToJump;

    [Header("Keybinds")]
    public KeyCode jumpkey = KeyCode.Space;

    [Header("Ground Check")]
    public float playerHeight;
    public LayerMask whatIsGround;
    bool grounded;

    public Transform orientation;

    float horizontalInput;
    float verticalInput;

    UnityEngine.Vector3 moveDirection;

    Rigidbody rb;


    private void Start()
    {
        rb = GetComponent<Rigidbody>();
        rb.freezeRotation = true;
        readyToJump = true; // 初始化跳跃就绪状态
    }

    private void Update()
    {
        //ground check
        grounded = Physics.Raycast(transform.position, UnityEngine.Vector3.down, playerHeight * 0.5f + 0.2f, whatIsGround);

        MyInput();
        speedControl();

        //handle drag
        if (grounded)
            rb.drag = groundDrag;
        else
            rb.drag = 0;
    }

    private void FixedUpdate()
    {
        MovePlayer();
    }

    private void MyInput()
    {
        horizontalInput = Input.GetAxisRaw("Horizontal");
        verticalInput = Input.GetAxisRaw("Vertical");

        //when to jump
        if(Input.GetKey(jumpkey) && readyToJump && grounded)
        {
            readyToJump = false;

            Jump();

            Invoke(nameof(ResetJump), jumpCooldown);
        }
    }

    private void MovePlayer()
    {
        // calculate movement direction
        moveDirection = orientation.forward * verticalInput + orientation.right * horizontalInput;
        
        // on ground
        if(grounded)
            rb.AddForce(moveDirection.normalized * moveSpeed * 10f,ForceMode.Force);

        // in air
        else if(!grounded)  
            rb.AddForce(moveDirection.normalized * moveSpeed * 10f * airMultiplier,ForceMode.Force);
    }

    private void speedControl()
    {
        UnityEngine.Vector3 flatVel = new UnityEngine.Vector3(rb.velocity.x, 0f, rb.velocity.z);

        //limit velocity if needed
        if(flatVel.magnitude > moveSpeed)
        {
            UnityEngine.Vector3 limitedVel = flatVel.normalized * moveSpeed;
            rb.velocity = new UnityEngine.Vector3(limitedVel.x, rb.velocity.y, limitedVel.z);
        }
    }

    private void Jump()
    {
        // reset y velocity
        rb.velocity = new UnityEngine.Vector3(rb.velocity.x, 0f, rb.velocity.z);

        rb.AddForce(transform.up * jumpForce, ForceMode.Impulse);
    }
    private void ResetJump()
    {
        readyToJump = true;
    }
}

内容的提问来源于stack exchange,提问作者Tjitse Jaspers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 08:45:05