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
相关产品推荐
相关产品推荐

