You need to enable JavaScript to run this app. Unity 2D中角色朝向左侧时手臂无法正常跟随光标旋转问题
优惠活动
大模型
产品
解决方案
定价
更多

Unity 2D中角色朝向左侧时手臂无法正常跟随光标旋转问题

问题根因分析
  • 旋转赋值逻辑冲突:先对transform.rotation赋值世界坐标旋转,后续又修改localRotation,部分操作被覆盖
  • 角色朝向判断不可靠:直接判断myPlayer.transform.eulerAngles.y == 0存在浮点数精度误差,容易出现判断失效的情况
  • 朝向左侧时的翻转逻辑错误:硬编码的rotationZ - 50属于无意义的偏移,且角度范围判断没有适配角色朝向变化后的前后方定义
  • 角度判断逻辑只适配了角色朝右的场景:当角色朝左时,“前方”对应的角度范围已经变为±90度以外的区域,原判断条件刚好把身后区域判定为不需要翻转的范围
修复方案

直接根据角色当前朝向适配旋转计算逻辑,移除冗余的重复赋值操作,修复后的代码如下:

using UnityEngine;

public class pivot : MonoBehaviour
{
    public GameObject myPlayer;

    private void FixedUpdate()
    {
        // 计算鼠标和手臂支点的世界坐标差
        Vector3 mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        Vector3 difference = mouseWorldPos - transform.position;
        difference.Normalize();

        // 计算原始旋转角度
        float rotationZ = Mathf.Atan2(difference.y, difference.x) * Mathf.Rad2Deg;
        // 判断角色当前朝向:y轴旋转接近0为朝右,接近180为朝左
        // 如果你是通过修改scale.x实现角色翻转,这里改为 bool isFacingRight = myPlayer.transform.scale.x > 0f 即可
        bool isFacingRight = myPlayer.transform.eulerAngles.y < 90f;

        if (isFacingRight)
        {
            // 朝右时的翻转逻辑:光标在身后时翻转手臂
            if (rotationZ < -90 || rotationZ > 90)
            {
                transform.localRotation = Quaternion.Euler(180, 0, -rotationZ);
            }
            else
            {
                transform.localRotation = Quaternion.Euler(0, 0, rotationZ);
            }
        }
        else
        {
            // 朝左时的翻转逻辑:角度范围判断取反
            if (rotationZ > -90 && rotationZ < 90)
            {
                transform.localRotation = Quaternion.Euler(180, 180, -rotationZ);
            }
            else
            {
                transform.localRotation = Quaternion.Euler(0, 180, rotationZ);
            }
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 18:06:04