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

Unity顶视角3D射击游戏鼠标位置转世界坐标返回恒定值问题

问题原因与解决方案

成因

  • Unity的Camera.ScreenToWorldPoint方法输入的屏幕坐标Z分量代表目标点距离相机的深度值(沿相机正前方方向计算)
  • 你直接使用的Input.mousePosition默认Z分量恒为0,相当于要转换的点和相机处于同一深度平面,因此无论屏幕点击位置如何变化,转换结果都会固定为相机本身的世界坐标(你项目中相机固定在(0.0, 25.0, 0.0),所以输出恒定为该值)

解决方法

顶视角3D场景下更通用的方案是通过射线检测获取鼠标对应地面的世界坐标,代码实现如下:

// 提前定义地面平面:顶视角下地面法线为向上的Y轴,平面原点为(0,0,0)
private Plane groundPlane = new Plane(Vector3.up, Vector3.zero);

void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        // 从相机向鼠标点击位置发射射线
        Ray mouseRay = mainCamera.ScreenPointToRay(Input.mousePosition);
        float rayHitDistance;
        // 计算射线与地面平面的交点
        if (groundPlane.Raycast(mouseRay, out rayHitDistance))
        {
            Vector3 mouseWorldPos = mouseRay.GetPoint(rayHitDistance);
            // 计算子弹发射方向
            Vector3 shootDirection = (mouseWorldPos - transform.position).normalized;
            // 后续可直接用该方向生成子弹、设置飞行速度
        }
    }
}

如果你的场景存在有高度差的地形,把上述平面检测替换为Physics.Raycast检测地形碰撞体即可。
如果你使用的是正交相机,也可以直接给屏幕坐标的Z分量赋值为相机到地面的垂直距离:

// 示例:相机到地面的垂直距离为25
Vector3 screenPos = Input.mousePosition;
screenPos.z = 25f;
Vector3 mouseWorldPos = mainCamera.ScreenToWorldPoint(screenPos);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 21:54:00