如何解决Unity中X轴正负方向AddForce速度不一致的问题
问题分析与解决
你的代码存在两个核心问题导致左右移动速度不一致:
按键检测方法不统一:向右移动用的是
Input.GetKeyDown(仅在按键按下的第一帧触发一次),而向左移动用的是Input.GetKey(只要按键按住,每帧都会触发)。这就导致左移时每帧都在给刚体加力,右移只有按下瞬间加一次力,自然左移速度更快。逻辑运算符优先级错误:
&&的优先级高于||,所以你的条件判断实际会被解析为Input.GetKeyDown(KeyCode.D) || (Input.GetKeyDown(KeyCode.RightArrow) && IsOnGround),这不符合你原本的逻辑——你应该是想“(按下D或右键)且在地面/空中”,需要给按键检测的部分加上括号。
修正后的代码
void FixedUpdate() { // 向右移动:统一用GetKey,确保按住时持续加力 if ((Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow)) && IsOnGround) { P_Rigidbody.AddForce(GroundSpeed, 0, 0, ForceMode.Acceleration); } else if ((Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow)) && !IsOnGround) { P_Rigidbody.AddForce(AirSpeed, 0, 0, ForceMode.Acceleration); } // 向左移动:保持GetKey,和右移逻辑一致 else if ((Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow)) && IsOnGround) { P_Rigidbody.AddForce(-GroundSpeed, 0, 0, ForceMode.Acceleration); } else if ((Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow)) && !IsOnGround) { P_Rigidbody.AddForce(-AirSpeed, 0, 0, ForceMode.Acceleration); } }
额外优化建议
可以把按键检测的逻辑提前提取,减少重复代码,让逻辑更清晰:
void FixedUpdate() { bool isRightPressed = Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow); bool isLeftPressed = Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow); if (isRightPressed) { float speed = IsOnGround ? GroundSpeed : AirSpeed; P_Rigidbody.AddForce(speed, 0, 0, ForceMode.Acceleration); } else if (isLeftPressed) { float speed = IsOnGround ? GroundSpeed : AirSpeed; P_Rigidbody.AddForce(-speed, 0, 0, ForceMode.Acceleration); } }
内容的提问来源于stack exchange,提问作者User
相关产品推荐
相关产品推荐

