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; } }
问题排查
- 右移触发条件错误:右键输入的判断块中,仅当
horizontalMove < 0时才执行代码,但初始状态horizontalMove为0,右键输入时无法进入该分支,导致右移逻辑完全不生效。 - 右移分支内逻辑嵌套错误:加速逻辑被嵌套在
horizontalMove < 0的if块内的else if中,永远不会被触发。 - 摩擦逻辑处理不全:无输入时,无论
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
相关产品推荐
相关产品推荐

