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

Unity 3D中我的C#角色跳跃代码无法工作,问题出在哪?

问题分析与修复方案

先拆解你代码里的几个核心问题:

1. 语法错误:FixedUpdate缺少代码块包裹

你的FixedUpdate()方法后面没有添加{},导致后续的跳跃判断代码不属于这个方法,Unity不会执行这段逻辑。

2. 碰撞检测逻辑漏洞

OnCollisionEnter仅在碰撞开始瞬间触发一次:

  • 角色碰到地面时CanJump会设为true,但如果之后碰到墙壁等其他物体,OnCollisionEnter会再次触发,CanJump被设为false——但此时角色可能还站在地面上,直接导致无法跳跃。
  • 若场景加载时角色直接处于地面上,不会触发OnCollisionEnter,初始的CanJump默认是false,导致开局就无法跳跃。

3. 输入检测逻辑错误

在FixedUpdate里用Input.GetKey("space")会导致按住空格时持续给刚体加力,角色会一直向上飘,应该用Input.GetKeyDown检测单次按键,仅触发一次跳跃动作。

4. 变量命名不合理

SideWaysForce是侧向力的含义,但你用来做跳跃的垂直力,改成JumpForce更直观。

修复后的完整代码

public Rigidbody rb;
public float JumpForce = 500f;
bool canJump = true; // 初始设为true,避免加载时角色在地面却无法跳跃

void OnCollisionStay(Collision collisionInfo)
{
    // 持续接触地面时,允许跳跃
    if (collisionInfo.collider.CompareTag("Ground"))
    {
        canJump = true;
    }
}

void OnCollisionExit(Collision collisionInfo)
{
    // 离开地面后,禁止跳跃
    if (collisionInfo.collider.CompareTag("Ground"))
    {
        canJump = false;
    }
}

void FixedUpdate()
{
    // 检测空格按下且允许跳跃时,施加跳跃力
    if (canJump && Input.GetKeyDown(KeyCode.Space))
    {
        // 用ForceMode.Impulse更适配跳跃的瞬时力逻辑,无需乘Time.deltaTime
        rb.AddForce(Vector3.up * JumpForce, ForceMode.Impulse);
        canJump = false; // 跳完直接锁死,避免空中重复触发
    }
}

额外注意事项

  • 确认地面物体的标签确实是Ground,并在Inspector面板把角色的Rigidbody组件拖入rb变量的赋值框。
  • 用CompareTag代替直接字符串比较,性能更优还能避免拼写错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 09:06:19