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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 08:04:55