如何将物体旋转至另一物体与鼠标位置间的夹角方向?
解决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
相关产品推荐
相关产品推荐

