Unity中镜像玩家后,如何实现角色朝向移动方向正确旋转?
问题解决:角色翻转后朝向角度错误
问题根源
你在facingRight=false的分支中错误地将movement.y乘以-1,这导致角度计算逻辑偏离预期。正确的做法应该是反转水平方向的输入(movement.x),因为角色通过localScale.x翻转后,世界空间的水平方向与角色本地的水平方向是相反的。
修正后的代码
首先移除无用的Quaternion.Euler(0, 0, 0);语句,然后调整角度计算的参数:
void Update() { float moveX = Input.GetAxis("Horizontal"); float moveY = Input.GetAxis("Vertical"); Vector2 movement = new Vector2(moveX, moveY); float angle; if (facingRight) { angle = Mathf.Atan2(movement.y, movement.x) * Mathf.Rad2Deg; } else { // 反转水平输入,匹配角色翻转后的本地坐标系 angle = Mathf.Atan2(movement.y, -movement.x) * Mathf.Rad2Deg; } float angleClamp = Mathf.Clamp(angle, -30.0f, 30.0f); transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.Euler(0, 0, angleClamp), rotateSpeed * Time.deltaTime); }
进一步优化(减少冗余)
你可以将角度计算逻辑合并,避免重复代码:
void Update() { float moveX = Input.GetAxis("Horizontal"); float moveY = Input.GetAxis("Vertical"); Vector2 movement = new Vector2(moveX, moveY); // 根据朝向决定水平输入的符号 float horizontalInput = facingRight ? movement.x : -movement.x; float angle = Mathf.Atan2(movement.y, horizontalInput) * Mathf.Rad2Deg; float angleClamp = Mathf.Clamp(angle, -30.0f, 30.0f); transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.Euler(0, 0, angleClamp), rotateSpeed * Time.deltaTime); }
效果验证
- 当
facingRight=true时:直行右为0度,上移为90度,下移为-90度,斜右上为45度,斜右下为-45度,符合预期。 - 当
facingRight=false时:直行左为0度,上移为90度,下移为-90度,斜左上为45度,斜左下为-45度,此时角色翻转后的视觉朝向与移动方向匹配,达到你想要的对称效果。
内容的提问来源于stack exchange,提问作者rmarsu
相关产品推荐
相关产品推荐

