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

如何让3D游戏角色在相机环绕时始终朝向鼠标光标?

解决3D游戏中角色随鼠标光标朝向的问题

你的代码只在相机正对角色时有效,核心问题是基于屏幕坐标差值计算角度的方式,没有考虑相机的空间旋转。当相机绕角色移动后,屏幕坐标的x/y对应的世界空间方向已经改变,自然会导致角色朝向错误。

下面是两种通用解决方案,适配不同场景:

场景1:角色在地面(固定Y平面)移动

通过射线检测获取鼠标对应的地面世界坐标,让角色朝向该点的水平方向:

public Camera cam;
// 角色所在地面的Y轴高度,根据你的场景调整
public float groundY = 0f;

void Update()
{
    // 生成从相机到鼠标位置的射线
    Ray mouseRay = cam.ScreenPointToRay(Input.mousePosition);
    // 创建平行于地面的检测平面
    Plane groundPlane = new Plane(Vector3.up, new Vector3(0, groundY, 0));
    float rayDistance;

    // 检测射线与地面的交点
    if (groundPlane.Raycast(mouseRay, out rayDistance))
    {
        // 获取交点的世界坐标
        Vector3 targetWorldPos = mouseRay.GetPoint(rayDistance);
        // 计算角色到目标点的水平方向(忽略Y轴,避免角色抬头低头)
        Vector3 horizontalDirection = targetWorldPos - transform.position;
        horizontalDirection.y = 0;

        // 仅当目标点与角色有足够距离时旋转,避免抖动
        if (horizontalDirection.magnitude > 0.1f)
        {
            transform.rotation = Quaternion.LookRotation(horizontalDirection);
        }
    }
}

场景2:空中/无固定平面的角色

直接用射线方向的水平分量作为朝向参考:

public Camera cam;

void Update()
{
    Ray mouseRay = cam.ScreenPointToRay(Input.mousePosition);
    // 提取射线的水平方向(忽略Y轴)
    Vector3 horizontalLookDir = mouseRay.direction;
    horizontalLookDir.y = 0;

    if (horizontalLookDir.magnitude > 0.1f)
    {
        transform.rotation = Quaternion.LookRotation(horizontalLookDir);
    }
}

这两种方案都基于世界空间计算,不管相机如何环绕角色旋转,角色都会正确朝向鼠标对应的空间位置,彻底解决视角变化后的朝向错误问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 20:42:02