Unity技术求助:鼠标点击无法获取平面对应地形位置,生成物体位置固定
问题分析与解决方案
我一眼就发现了问题的核心:你当前的射线生成逻辑完全忽略了鼠标的点击位置!你创建的射线是固定从平面的原点向下发射的,不管你点击屏幕的哪个位置,这条射线都不会改变,所以每次命中的地形位置都是同一个固定点,物体自然只会生成在那里。
修复步骤与代码修正
我们需要让射线从鼠标点击的屏幕位置出发,先命中平面,再从平面的命中点向下发射射线到地形,这样才能把鼠标点击的平面位置对应到地形上。下面是修正后的SpawnThroughPlane方法:
public void SpawnThroughPlane() { if (Input.GetMouseButtonDown(0)) { // 第一步:从鼠标点击位置创建射线,朝向场景内部 Ray mouseRay = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit planeHit; // 先检测射线是否命中平面(确保平面有启用的Collider,比如MeshCollider) if (Physics.Raycast(mouseRay, out planeHit, Mathf.Infinity)) { // 第二步:从平面的命中点向下发射射线,检测地形 Ray terrainRay = new Ray(planeHit.point, Vector3.down); RaycastHit terrainHit; if (Physics.Raycast(terrainRay, out terrainHit, Mathf.Infinity, terrainLayer)) { // 第三步:在地形的命中位置生成物体,加上偏移避免卡进地形 var spawnedObject = Instantiate(prefabToSpawn); spawnedObject.transform.position = terrainHit.point + new Vector3(0, yOffset, 0); } } } }
额外需要检查的细节
- 确保你的平面物体有启用的Collider(比如
MeshCollider,如果是自定义平面,记得勾选MeshCollider的Convex选项,否则可能无法被射线检测到)。 - 确认
Camera.main是正确的主相机,主相机需要勾选MainCamera标签。 - 你之前用
terrain.SampleHeight的方式其实可以替换成直接用terrainHit.point,因为射线已经直接命中了地形表面,位置更准确。
为什么之前的代码不生效?
你注释掉的Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);才是正确获取鼠标射线的方式,但你换成了固定从plane.transform.position发射的射线,这直接切断了鼠标位置和射线的关联,导致所有点击都指向同一个点。
内容的提问来源于stack exchange,提问作者Daniel Lip




