You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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,如果是自定义平面,记得勾选MeshColliderConvex选项,否则可能无法被射线检测到)。
  • 确认Camera.main是正确的主相机,主相机需要勾选MainCamera标签。
  • 你之前用terrain.SampleHeight的方式其实可以替换成直接用terrainHit.point,因为射线已经直接命中了地形表面,位置更准确。

为什么之前的代码不生效?

你注释掉的Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);才是正确获取鼠标射线的方式,但你换成了固定从plane.transform.position发射的射线,这直接切断了鼠标位置和射线的关联,导致所有点击都指向同一个点。

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

火山引擎 最新活动