Unity角色移动无故停滞,切换方向才可恢复的问题修复咨询
Unity角色移动无故停滞问题排查与解决
问题描述
控制角色移动时,角色会无故停止移动,切换至其他方向后切回原方向才可恢复。故障触发时Horizontal输入数值正常,且无特定触发位置。
原实现代码
using System.Collections; using System.Collections.Generic; using System.Runtime.CompilerServices; using UnityEngine; public class CharacterController : MonoBehaviour { private float horizontal; private float speed=5f; private Rigidbody2D rb; void Start() { rb= GetComponent<Rigidbody2D>(); } void Update() { horizontal = Input.GetAxis("Horizontal"); Debug.Log(horizontal); } private void FixedUpdate() { rb.velocity= new Vector2(speed*horizontal,rb.velocity.y); } }
排查与解决方法
1. 检查Rigidbody2D组件设置
- 开启插值功能:在Inspector面板的Rigidbody2D组件中,将Interpolate选项设置为
Interpolate或Extrapolate,解决物理更新与画面渲染不同步导致的卡顿停滞。 - 确认未冻结水平位置:检查Freeze Position下的X轴未被勾选,避免锁死水平移动。
2. 调整碰撞体物理材质
- 给角色的Collider2D添加
Physics Material 2D,将Friction(摩擦系数)和Bounciness(弹性)均设为0,排除过高摩擦导致的意外停止。
3. 优化代码逻辑
- 尝试在FixedUpdate中直接获取输入,避免Update与FixedUpdate的变量同步延迟:
private void FixedUpdate() { float horizontal = Input.GetAxis("Horizontal"); rb.velocity = new Vector2(speed * horizontal, rb.velocity.y); } - (可选)添加输入阈值过滤,避免极小输入值干扰:
void Update() { float rawInput = Input.GetAxis("Horizontal"); horizontal = Mathf.Abs(rawInput) > 0.1f ? rawInput : 0f; }
4. 排查其他脚本干扰
检查项目中是否存在其他修改Rigidbody2D的velocity或position的脚本(如动画控制器、碰撞检测脚本等),这些脚本可能会覆盖移动逻辑导致停滞。
内容的提问来源于stack exchange,提问作者Dava Davilion
相关产品推荐
相关产品推荐

