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

如何让物体仅绕Y轴旋转朝向鼠标光标?附现有旋转代码咨询

仅绕Y轴让物体朝向鼠标光标及跟随旋转实现方案

一、仅绕Y轴朝向鼠标光标

你的原代码使用LookAt时,会让物体绕所有轴旋转——因为目标点的Y轴高度可能与物体不一致,导致物体出现上下倾斜。要实现仅绕Y轴旋转,只需消除目标点与物体的Y轴差异即可,以下两种方法都能实现:

方法1:修改目标点Y值(简单直接)

void Update()
{
    Plane plane = new Plane(Vector3.up, transform.position);
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

    if (plane.Raycast(ray, out float distance))
    {
        Vector3 targetPosition = ray.GetPoint(distance);
        // 强制目标点Y轴与物体自身Y轴一致,消除上下方向的旋转影响
        targetPosition.y = transform.position.y;
        // 此时LookAt只会让物体绕Y轴旋转朝向目标
        transform.LookAt(targetPosition);
    }
}

方法2:使用方向向量构建旋转(更灵活,支持平滑过渡)

void Update()
{
    Plane plane = new Plane(Vector3.up, transform.position);
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

    if (plane.Raycast(ray, out float distance))
    {
        Vector3 targetPosition = ray.GetPoint(distance);
        // 计算物体到目标点的水平方向向量,移除Y轴分量
        Vector3 lookDirection = targetPosition - transform.position;
        lookDirection.y = 0;

        // 避免鼠标离物体过近时的旋转抖动
        if (lookDirection.magnitude > 0.1f)
        {
            // 创建仅绕Y轴旋转的目标姿态
            Quaternion targetRotation = Quaternion.LookRotation(lookDirection);
            // 平滑旋转(可根据需求调整5f这个速度参数)
            transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, Time.deltaTime * 5f);
            // 如果不需要平滑,直接赋值:transform.rotation = targetRotation;
        }
    }
}

二、让物体跟随鼠标光标旋转

如果是指跟随鼠标拖动动作旋转,可以直接监听鼠标X轴输入来控制旋转:

// 可在Inspector面板调整旋转速度
public float rotationSpeed = 10f;

void Update()
{
    // 获取鼠标水平移动增量,控制物体绕Y轴旋转
    float mouseXInput = Input.GetAxis("Mouse X");
    transform.Rotate(0, mouseXInput * rotationSpeed * Time.deltaTime, 0);
}

如果是指始终朝向鼠标所在位置并实时跟随移动,上面第一部分的代码已经实现——每帧都会根据鼠标位置更新物体朝向。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 09:48:14