Unity基础平台游戏角色移动触碰墙壁卡顿问题技术求助
解决Unity 2D角色碰墙卡住的问题
嘿,作为Unity新手碰到这种卡墙的问题真的超常见!我看了你的移动脚本,问题出在直接强制设置Rigidbody2D的velocity上——当角色撞到墙时,物理引擎会试图阻挡你的移动,但你每帧都在硬塞x方向的速度,导致角色和墙面“顶牛”,就卡在那儿不动了,直到你松开按键停止施加力才恢复。
问题根源分析
你当前的FixedUpdate里直接把rb.velocity设成new Vector2(mx * movementSpeed, rb.velocity.y),这相当于完全忽略了物理碰撞的反馈:不管角色有没有碰到障碍物,都硬要让它保持这个水平速度,自然会和墙面产生冲突,导致卡顿。
可行解决方案
方案1:改用AddForce实现移动(推荐,更符合物理引擎逻辑)
这种方法是给刚体施加持续力,而非直接控制速度,物理引擎会自动处理碰撞交互,从根源避免卡墙。修改你的FixedUpdate方法:
private void FixedUpdate() { // 用AddForce代替直接设置velocity,ForceMode2D.Force适合持续施加的力 rb.AddForce(new Vector2(mx * movementSpeed, 0f), ForceMode2D.Force); // 限制最大水平速度,防止角色越跑越快失去控制 float maxHorizontalSpeed = 5f; if (Mathf.Abs(rb.velocity.x) > maxHorizontalSpeed) { rb.velocity = new Vector2(Mathf.Sign(rb.velocity.x) * maxHorizontalSpeed, rb.velocity.y); } }
注意:这里的
movementSpeed数值要调小一些,因为AddForce的力度量级和直接设置velocity不一样,比如原来设50,现在改设5左右就够了,你可以根据实际手感慢慢调整。
方案2:检测墙面碰撞,碰到墙时停止施加水平力
如果你还是想保留直接设置velocity的方式,可以在设置前先检测角色左右是否有墙,有墙时就不再强制施加水平速度:
首先在脚本里新增一个检测墙面的方法:
public bool isTouchingWall() { // 用两个射线检测角色左右两侧,可根据角色大小调整射线长度和起始位置 RaycastHit2D leftHit = Physics2D.Raycast(transform.position, Vector2.left, 0.6f, groundLayer); RaycastHit2D rightHit = Physics2D.Raycast(transform.position, Vector2.right, 0.6f, groundLayer); // 左右任意一侧碰到墙就返回true return leftHit.collider != null || rightHit.collider != null; }
然后修改FixedUpdate逻辑:
private void FixedUpdate() { float targetHorizontalVelocity = rb.velocity.x; // 只有没碰到墙的时候,才根据输入设置水平速度 if (!isTouchingWall()) { targetHorizontalVelocity = mx * movementSpeed; } else { // 碰到墙时把水平速度清零,也可以设个小数值模拟摩擦力 targetHorizontalVelocity = 0f; } rb.velocity = new Vector2(targetHorizontalVelocity, rb.velocity.y); }
小提示:如果你的墙面和地面不在同一个Layer,建议单独建一个
wallLayer专门用于墙面检测,这样结果会更准确。
额外优化建议
- 调整Rigidbody2D参数:把Linear Drag设为1-2,让角色停止移动时能自然减速;把Collision Detection设为Continuous Dynamic,防止角色高速移动时出现穿模。
- 检查地面检测:确保
feet的Transform位置在角色脚底中心,OverlapCircle的半径不要太大,避免误判地面碰撞。
你之前注释掉的那段修复代码逻辑没找对问题点,直接删掉就好啦~
内容的提问来源于stack exchange,提问作者human




