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

如何将物体旋转至另一物体与鼠标位置间的夹角方向?

解决2D游戏中手臂朝向鼠标旋转的问题

问题分析

你当前代码的核心问题:

  • Vector2.Angle计算的是两个点之间的夹角,并非关节指向鼠标的方向角,且RotateAround是让物体绕点旋转指定角度,每次Update都会叠加旋转,导致手臂持续转圈。
  • ScreenToWorldPoint未设置z轴值,2D场景中鼠标位置的z为0,直接转换会得到相机平面内的错误坐标,造成方向计算偏差。

正确实现方案

以下两种可靠实现方式任选其一即可:


方法1:通过方向向量计算角度设置旋转

适合2D场景的直观实现:

using UnityEngine;

public class RotateArm : MonoBehaviour
{
    public GameObject joint;
    public Camera cam;

    void Update()
    {
        // 获取鼠标世界坐标,设置z值为相机到关节的距离,避免坐标错误
        Vector3 mouseWorldPos = cam.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, cam.transform.position.z - joint.transform.position.z));
        
        // 计算从关节指向鼠标的方向向量
        Vector2 direction = mouseWorldPos - joint.transform.position;
        
        // 计算方向对应的角度,Atan2返回弧度,转成角度
        float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
        
        // 设置手臂绕z轴旋转对应角度
        transform.rotation = Quaternion.Euler(0, 0, angle);
        
        // 保持手臂相对于关节的位置,0.5f为手臂长度,按需调整
        transform.position = joint.transform.position + Quaternion.Euler(0, 0, angle) * new Vector3(1, 0, 0) * 0.5f;
    }
}

方法2:适配2D场景的LookAt实现

改造Unity的3D LookAt接口适配2D需求:

using UnityEngine;

public class RotateArm : MonoBehaviour
{
    public GameObject joint;
    public Camera cam;

    void Update()
    {
        Vector3 mouseWorldPos = cam.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, cam.transform.position.z - joint.transform.position.z));
        
        // 调整目标点z轴与手臂一致,适配2D旋转逻辑
        Vector3 lookTarget = new Vector3(mouseWorldPos.x, mouseWorldPos.y, transform.position.z);
        
        // 让手臂朝向目标点
        transform.LookAt(lookTarget);
        
        // 修正2D场景下的翻转问题
        transform.rotation = Quaternion.Euler(0, 0, transform.eulerAngles.z);
        
        // 保持手臂与关节的相对位置,0.5f为手臂长度,按需调整
        transform.position = joint.transform.position + (transform.right * 0.5f);
    }
}

关键注意点

  • 确保joint对象是手臂的父物体,或在代码中严格控制手臂相对于关节的位置,避免偏移。
  • 调整代码中的手臂长度参数,匹配你实际的美术资源尺寸。

内容的提问来源于stack exchange,提问作者Business Cactus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 08:30:52