You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 00:37:20