Unity中武器朝向鼠标旋转时长度异常变化的问题求助
问题原因与解决方法
问题根源
你遇到的武器“长度忽长忽短”问题,本质是鼠标位置转换到世界空间时Z坐标不匹配:Camera.main.ScreenToWorldPoint(Input.mousePosition)使用的Input.mousePosition只有屏幕XY坐标,Z值默认是0。如果你的武器和相机不在同一Z平面,转换出的mouseP会和武器的Z坐标有偏差,导致计算的方向向量包含Z轴分量。虽然你强制绕Z轴旋转,但武器实际朝向的是3D空间中的点,在透视投影下就会出现视觉上的缩放错觉(近大远小导致的视觉变形)。
修复步骤
1. 对齐鼠标位置的Z坐标
确保转换后的鼠标位置和武器在同一Z平面,根据相机类型选择对应方法:
正交相机场景
直接强制鼠标位置的Z坐标与武器一致:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Rotation : MonoBehaviour { private Vector3 mouseP; void Update() { mouseP = Camera.main.ScreenToWorldPoint(Input.mousePosition); mouseP.z = transform.position.z; // 关键:将鼠标位置Z轴对齐到武器所在平面 Vector3 direct = mouseP - transform.position; // 修正方向:获取鼠标指向武器的向量(原代码是反方向) direct.Normalize(); float Angle = Mathf.Atan2(direct.y, direct.x) * Mathf.Rad2Deg; Quaternion rotate = Quaternion.Euler(0, 0, Angle); transform.rotation = rotate; } }
透视相机场景
用射线检测获取武器所在平面的鼠标交点,精度更高:
using System.Collections; using System.Collections; using UnityEngine; public class Rotation : MonoBehaviour { private Vector3 mouseP; void Update() { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); // 创建过武器位置、垂直于屏幕的平面(默认Z轴为屏幕垂直方向) Plane plane = new Plane(Vector3.forward, transform.position); if (plane.Raycast(ray, out float distance)) { mouseP = ray.GetPoint(distance); Vector3 direct = mouseP - transform.position; direct.Normalize(); float Angle = Mathf.Atan2(direct.y, direct.x) * Mathf.Rad2Deg; Quaternion rotate = Quaternion.Euler(0, 0, Angle); transform.rotation = rotate; } } }
2. 额外修正:方向向量的正确性
原代码中transform.position - mouseP得到的是武器指向自身到鼠标的反方向,会导致武器背向鼠标旋转。改成mouseP - transform.position才能让武器正确朝向鼠标位置。
内容的提问来源于stack exchange,提问作者В'ячеслав Іван
相关产品推荐
相关产品推荐

