Unity方形角色跳跃旋转与跳跃高度冲突的技术问题求助
问题分析与修复方案
跳跃高度异常的核心原因
你现在的问题和旋转动画无关,是代码里的物理控制逻辑出了问题:
- 直接用
Transform.Translate移动角色:这会绕过Rigidbody2D的物理模拟,强行修改位置,和Rigidbody的velocity产生冲突,导致跳跃的竖直速度被干扰,看起来高度变低。 - 跳跃时清空水平速度:
Jump()里把velocity的x设为0,不仅让跳跃时人物突然停住,还会打乱物理引擎的速度计算,进一步压低跳跃高度。 isGrounded判断逻辑有缺陷:OnCollisionExit2D只要离开任何碰撞就设为false,比如角色站在两个方块上,离开其中一个就会误判为浮空,导致无法再次跳跃。
修复后的代码
using UnityEngine; public class MoveScript : MonoBehaviour { private bool isGrounded = true; public float walkSpeed = 5; public float jumpHeight = 7; public Rigidbody2D myRigidBody; public Animator myAnimator; void Start() { // 冻结Rigidbody的旋转,确保动画旋转不会影响物理模拟 myRigidBody.freezeRotation = true; } // 用Stay判断接地,确保只有完全离开地面才会设为false void OnCollisionStay2D(Collision2D col) { // 检查碰撞是否来自下方(简单判断接触点的法线方向) foreach (ContactPoint2D contact in col.contacts) { if (contact.normal.y > 0.7f) // 法线向上,说明是地面 { isGrounded = true; return; } } } void OnCollisionExit2D(Collision2D col) { isGrounded = false; } void Update() { // 用Rigidbody的velocity控制水平移动,符合物理规则 Vector2 currentVelocity = myRigidBody.velocity; currentVelocity.x = walkSpeed; myRigidBody.velocity = currentVelocity; if (Input.GetMouseButtonDown(0) && isGrounded) { Jump(); myAnimator.SetTrigger("RotateTrigger"); } } void Jump() { // 保留水平速度,只修改竖直速度 Vector2 currentVelocity = myRigidBody.velocity; currentVelocity.y = jumpHeight; myRigidBody.velocity = currentVelocity; } }
关键修改点说明
- 冻结Rigidbody旋转:在
Start里设置freezeRotation = true,这样动画修改角色的视觉旋转时,不会影响Rigidbody的物理状态,彻底避免旋转和跳跃的冲突。 - 改用
Rigidbody.velocity移动:不再用Translate直接改位置,让物理引擎统一处理移动和跳跃,避免逻辑冲突。 - 跳跃保留水平速度:跳跃时只修改y轴速度,x轴保持行走速度,更符合游戏逻辑,也不会干扰物理计算。
- 优化接地判断:通过碰撞接触点的法线方向判断是否真的站在地面上,避免误判。
内容的提问来源于stack exchange,提问作者jude
相关产品推荐
相关产品推荐

