Unity中角色无法始终朝向鼠标位置问题求助
解决Unity俯视角角色朝向鼠标的问题
你的代码问题出在屏幕坐标转世界坐标的参数设置,以及LookAt方法可能导致角色非Y轴的旋转异常。以下是两种可靠的修正方案:
方案一:修正坐标转换与旋转逻辑
void Update() { Vector3 mouseScreenPos = Input.mousePosition; // 计算相机到角色所在平面的距离(俯视角下角色Y坐标固定) float depth = Camera.main.transform.position.y - transform.position.y; Vector3 mouseWorldPos = Camera.main.ScreenToWorldPoint(new Vector3(mouseScreenPos.x, mouseScreenPos.y, depth)); // 只保留X-Z平面的朝向,忽略Y轴高度差 Vector3 lookDir = new Vector3(mouseWorldPos.x - transform.position.x, 0, mouseWorldPos.z - transform.position.z); // 避免鼠标在角色原点时的旋转异常 if (lookDir.magnitude > 0.1f) { transform.rotation = Quaternion.LookRotation(lookDir, Vector3.up); } }
方案二:用射线检测获取平面鼠标位置(更稳定)
void Update() { Ray mouseRay = Camera.main.ScreenPointToRay(Input.mousePosition); // 创建与角色Y坐标一致的地面平面 Plane groundPlane = new Plane(Vector3.up, transform.position); if (groundPlane.Raycast(mouseRay, out float rayDistance)) { Vector3 mouseWorldPos = mouseRay.GetPoint(rayDistance); Vector3 lookDir = mouseWorldPos - transform.position; lookDir.y = 0; if (lookDir.magnitude > 0.1f) { transform.rotation = Quaternion.LookRotation(lookDir, Vector3.up); } } }
问题原因说明
- 原代码中
ScreenToWorldPoint的z参数用了相机的Y坐标,这是错误的:该参数需要的是屏幕点到相机的深度距离(沿相机前方向),而非相机的Y轴位置。 - 直接使用
LookAt会让角色产生X轴的旋转(抬头/低头),俯视角只需要角色绕Y轴旋转朝向鼠标,因此需要单独计算X-Z平面的方向并设置旋转。
内容的提问来源于stack exchange,提问作者I Am Me
相关产品推荐
相关产品推荐

