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

如何在2D游戏中实现轨迹线随输入位置变化的3D旋转

Unity轨迹线3D旋转复现问题修复方案

尝试复现某款游戏中轨迹线随鼠标控制的3D旋转效果时,现有代码未达到预期,以下是问题分析及修正方案:

问题代码

var worldClickPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
var facingDirection = (worldClickPosition - playerScript.transform.position).normalized;
var angle = Vector3.Angle(Vector3.right, facingDirection);
var rotation = Quaternion.Euler(0,angle - 90f, angle -90f);
trajectories.Rotate(Input.mousePosition);

核心问题分析

  1. 3D坐标获取错误:ScreenToWorldPoint直接传入Input.mousePosition时,Z轴默认值为0,在3D场景中会导致获取的世界位置偏离实际交互平面,无法得到正确的鼠标指向。
  2. 旋转逻辑混乱:Vector3.Angle返回无符号角度,无法区分左右旋转方向;同时将同一角度同时应用到Y、Z轴,不符合3D旋转的空间逻辑。
  3. 旋转调用错误:trajectories.Rotate(Input.mousePosition)直接使用屏幕坐标作为旋转参数,完全不符合Unity旋转方法的参数要求。

修正代码示例

使用射线检测获取准确的3D鼠标交互点,并计算正确的旋转角度:

// 从主相机向鼠标位置发射射线
Ray mouseRay = Camera.main.ScreenPointToRay(Input.mousePosition);
// 创建一个以玩家位置为基准的水平检测平面(可根据需求调整平面方向)
Plane interactionPlane = new Plane(Vector3.up, playerScript.transform.position);

if (interactionPlane.Raycast(mouseRay, out float rayDistance))
{
    // 获取射线与平面的交点,即鼠标对应的3D世界位置
    Vector3 targetWorldPos = mouseRay.GetPoint(rayDistance);
    // 计算玩家指向目标点的方向,忽略Y轴高度差(保持水平旋转)
    Vector3 lookDirection = targetWorldPos - playerScript.transform.position;
    lookDirection.y = 0;
    lookDirection.Normalize();

    // 计算绕Y轴的水平旋转角度(区分左右方向)
    float yRotation = Mathf.Atan2(lookDirection.z, lookDirection.x) * Mathf.Rad2Deg;
    // 生成目标旋转四元数
    Quaternion targetRotation = Quaternion.Euler(0, yRotation, 0);
    // 直接赋值旋转(如需平滑旋转可改用Quaternion.Lerp)
    trajectories.transform.rotation = targetRotation;
}

扩展调整(如需俯仰旋转)

如果需要轨迹线同时支持上下俯仰的3D旋转,可添加X轴角度计算:

Vector3 lookDirection = targetWorldPos - playerScript.transform.position;
lookDirection.Normalize();

// 水平旋转角度(Y轴)
float yRotation = Mathf.Atan2(lookDirection.z, lookDirection.x) * Mathf.Rad2Deg;
// 俯仰旋转角度(X轴)
float xRotation = Mathf.Atan2(lookDirection.y, Mathf.Sqrt(lookDirection.x * lookDirection.x + lookDirection.z * lookDirection.z)) * Mathf.Rad2Deg;

Quaternion targetRotation = Quaternion.Euler(xRotation, yRotation, 0);
trajectories.transform.rotation = targetRotation;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 08:02:44