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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 21:55:09