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

Unity中Input.GetAxisRaw仅支持左移不支持右移问题排查

解决A-Level计算机科学项目中索尼克风格动量系统右移失效问题

问题描述

为A-Level计算机科学编程项目开发索尼克风格的加速度与动量系统,已完成左移逻辑,但角色无法右移。使用Input.GetAxisRaw获取水平输入(左-1、右1、无输入0),预期逻辑为:按左/右键时对应方向加速,无输入时通过摩擦减速至0。

原代码

float acceleration_speed = 0.46875f;
float deceleration_speed = 5.0f;
float friction_speed = 0.66875f;
float top_speed = 60.0f;
float horizontalMove = 0f;

if (Input.GetAxisRaw("Horizontal") < 0) //if player is pressing left
{
    if (horizontalMove > 0.0f)
    {
        horizontalMove -= deceleration_speed; //decelerate

        if (horizontalMove <= 0.0f)
        {
            horizontalMove = -0.5f;
        }
    }

    else if (horizontalMove > -top_speed)
    {
        horizontalMove -= acceleration_speed; //accelerate
        if (horizontalMove <= -top_speed)
        {
            horizontalMove = -top_speed; //impose top speed limit
        }
    }

}

if (Input.GetAxisRaw("Horizontal") > 0) //if player is pressing right
{
    if (horizontalMove < 0.0f) //if moving to the left
    {
        horizontalMove += deceleration_speed; //decelerate
        if (horizontalMove >= 0.0f)
        {
            horizontalMove = 0.5f;
        }

        else if (horizontalMove < top_speed)
        {
            horizontalMove += acceleration_speed; //accelerate
            if (horizontalMove >= top_speed)
            {
                horizontalMove = top_speed; //impose top speed limit
            }
        }
    }
}

if (Input.GetAxis("Horizontal") == 0)
{
    horizontalMove -= friction_speed; //decelerate
    if (horizontalMove <= 0)
    {
        horizontalMove = 0.0f;
    }
}

问题排查

  1. 右移触发条件错误:右键输入的判断块中,仅当horizontalMove < 0时才执行代码,但初始状态horizontalMove为0,右键输入时无法进入该分支,导致右移逻辑完全不生效。
  2. 右移分支内逻辑嵌套错误:加速逻辑被嵌套在horizontalMove < 0的if块内的else if中,永远不会被触发。
  3. 摩擦逻辑处理不全:无输入时,无论horizontalMove是正(右移)还是负(左移),都执行horizontalMove -= friction_speed,这会错误地抵消右移速度,同时无法处理左移状态下的减速。

修正后的代码

float acceleration_speed = 0.46875f;
float deceleration_speed = 5.0f;
float friction_speed = 0.66875f;
float top_speed = 60.0f;
float horizontalMove = 0f;

// 左移逻辑
if (Input.GetAxisRaw("Horizontal") < 0)
{
    // 当前向右移动,先减速
    if (horizontalMove > 0.0f)
    {
        horizontalMove -= deceleration_speed;
        // 减速到0后直接赋予初始左移速度
        if (horizontalMove <= 0.0f)
        {
            horizontalMove = -0.5f;
        }
    }
    // 当前静止或左移,加速到上限
    else if (horizontalMove > -top_speed)
    {
        horizontalMove -= acceleration_speed;
        if (horizontalMove <= -top_speed)
        {
            horizontalMove = -top_speed;
        }
    }
}
// 右移逻辑
else if (Input.GetAxisRaw("Horizontal") > 0)
{
    // 当前向左移动,先减速
    if (horizontalMove < 0.0f)
    {
        horizontalMove += deceleration_speed;
        // 减速到0后直接赋予初始右移速度
        if (horizontalMove >= 0.0f)
        {
            horizontalMove = 0.5f;
        }
    }
    // 当前静止或右移,加速到上限
    else if (horizontalMove < top_speed)
    {
        horizontalMove += acceleration_speed;
        if (horizontalMove >= top_speed)
        {
            horizontalMove = top_speed;
        }
    }
}
// 无输入时的摩擦减速
else
{
    // 根据当前移动方向处理摩擦
    if (horizontalMove > 0)
    {
        horizontalMove -= friction_speed;
        if (horizontalMove <= 0)
        {
            horizontalMove = 0;
        }
    }
    else if (horizontalMove < 0)
    {
        horizontalMove += friction_speed;
        if (horizontalMove >= 0)
        {
            horizontalMove = 0;
        }
    }
}

修正说明

  • 调整右移逻辑的结构:将右移的加速分支从嵌套的if中移出,确保静止状态下右键输入能触发加速。
  • 优化摩擦逻辑:根据horizontalMove的正负分别处理减速,保证左右移状态下都能正确减速到0。
  • 用else if整合输入判断:避免多个if块同时触发的潜在问题,逻辑更清晰。

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 05:15:35