Unity2D角色无法跳跃求助:按下上箭头键无反应
Unity2D角色跳跃异常问题修复方案
问题根源与修复步骤
OnCollisionEnter2D回调未触发:你的
OnCollisionEnter2D()缺少Collision2D参数,Unity的碰撞回调方法必须带有该参数才会被系统调用。修正后的方法如下:private void OnCollisionEnter2D(Collision2D collision) { isGrounded = true; }跳跃逻辑顺序错误:你在检测跳跃条件前,先将
isGrounded设为false,导致Input.GetKey(KeyCode.UpArrow) && isGrounded永远不成立。需移除该错误逻辑,改用碰撞退出回调处理地面状态。输入检测方式错误:使用
Input.GetKey会在按住按键的每一帧都触发跳跃,导致角色持续上升;应改用Input.GetKeyDown,仅在按键按下的第一帧触发跳跃,符合正常跳跃逻辑。地面检测精度不足:建议给地面物体设置专属标签(如"Ground"),只在接触地面时修改
isGrounded状态,避免碰到其他物体误触发。
修正后的完整代码
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerMovement : MonoBehaviour { [SerializeField] private float moveSpeed; [SerializeField] private float jumpForce; // 单独设置跳跃力,与移动速度分离更合理 private Rigidbody2D body; bool isGrounded; private void Awake() { body = GetComponent<Rigidbody2D>(); } private void Update() { float horizontalInput = Input.GetAxis("Horizontal"); // 水平移动处理 body.velocity = new Vector2(horizontalInput * moveSpeed, body.velocity.y); // 角色翻转处理 if (horizontalInput < -0.01f) transform.localScale = new Vector3(-1, 1, 1); else if (horizontalInput > 0.01f) transform.localScale = Vector3.one; // 跳跃处理:仅在按键按下瞬间且落地时触发 if (Input.GetKeyDown(KeyCode.UpArrow) && isGrounded) { body.velocity = new Vector2(body.velocity.x, jumpForce); isGrounded = false; // 起跳后直接标记为非地面状态 } } private void OnCollisionEnter2D(Collision2D collision) { if (collision.gameObject.CompareTag("Ground")) isGrounded = true; } private void OnCollisionExit2D(Collision2D collision) { if (collision.gameObject.CompareTag("Ground")) isGrounded = false; } }
内容的提问来源于stack exchange,提问作者Enderplasma
相关产品推荐
相关产品推荐

