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
相关产品推荐
相关产品推荐

