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

Unity3D横版游戏中枪械绕Z轴旋转朝向XY平面鼠标的问题

3D横版卷轴游戏枪械绕Z轴朝向鼠标实现方案

问题说明

  • 需求:3D横版卷轴游戏中,实现枪械仅绕Z轴旋转,平滑且准确指向XY平面内的鼠标位置
  • 现存异常:之前尝试LookAt方法、手动角度计算两种方案,均仅能在半屏范围内正常工作,指向存在偏差
  • 已有代码框架:
void FixedUpdate()
{
    screenPosition = Input.mousePosition;
    screenPosition.z = 1; //mainCamera.nearClipPlane + 1;
    worldPosition = mainCamera.ScreenToWorldPoint(screenPosition);
    worldPosition.z = 0;

     
     
     //Angle?????

     

     transform.rotation = Quaternion.Slerp(rb.transform.rotation, 
     Quaternion.Euler(0,0,angle), 0.7f);
}

失效原因

半屏指向不准的核心问题是缺失从枪械自身位置出发到鼠标点位的方向向量计算,直接用鼠标世界坐标计算角度会默认以世界坐标(0,0,0)为旋转原点,而非枪械自身位置,同时遗漏了弧度转角度的转换逻辑。

补全后的可运行代码

void FixedUpdate()
{
    screenPosition = Input.mousePosition;
    screenPosition.z = 1; // 正交相机直接填1,透视相机建议改为mainCamera.nearClipPlane + 枪械到相机的Z轴距离
    worldPosition = mainCamera.ScreenToWorldPoint(screenPosition);
    worldPosition.z = 0;

    // 补全角度计算逻辑
    // 1. 计算从枪械当前位置指向鼠标世界坐标的方向向量
    Vector3 aimDirection = worldPosition - transform.position;
    // 2. 用Atan2计算方向对应的弧度,转成角度值
    float angle = Mathf.Atan2(aimDirection.y, aimDirection.x) * Mathf.Rad2Deg;
    // 适配项:如果你的枪械美术初始朝向是Y轴向上(而非X轴正方向),取消下一行注释
    // angle -= 90f;

    transform.rotation = Quaternion.Slerp(rb.transform.rotation, 
    Quaternion.Euler(0,0,angle), 0.7f);
}

注意事项

  • 横版游戏如果使用透视相机,screenPosition.z的值需要设置为相机和枪械对象之间的Z轴距离差,否则会出现透视带来的指向偏移;正交相机直接填固定值即可
  • 确保枪械对象的旋转轴Z轴与世界Z轴平行,不要存在额外的X、Y轴初始旋转偏移
  • 平滑系数0.7可根据需求调整,数值越大转向越快,数值越小转向越缓

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 11:03:15