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

Unity中用C#在鼠标位置实例化ballPrefab位置异常求助

解决Unity鼠标点击实例化预制体到光标位置的问题

问题根源

ScreenToWorldPoint 需要包含深度信息(z值)的屏幕坐标才能正确转换为世界位置,但 Input.mousePosition 的z值默认是0,这会导致转换后的位置始终固定在相机的近裁剪平面上。再加上你的相机朝向全局X轴,最终就出现了无论点击哪里,预制体的y、z坐标都不变的情况。

解决方案:用射线投射获取正确位置

射线投射是Unity里获取鼠标点击对应世界位置的标准方案,刚好适配你的相机朝向场景。这里给两种实现方式,按需选择:

方式1:基于场景碰撞体检测(适合有地面/平面的场景)

如果你的场景里有带Collider的地面或平面,可以直接让射线检测这个碰撞体的交点:

[SerializeField]
private GameObject ballPrefab;
// 可选:指定只检测某一层的物体,避免误触其他模型
[SerializeField]
private LayerMask targetLayer;

void Update()
{
    if (Input.GetButtonDown("Fire1"))
    {
        // 生成从相机穿过鼠标位置的射线
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        // 检测射线命中的物体
        if (Physics.Raycast(ray, out RaycastHit hitInfo, Mathf.Infinity, targetLayer))
        {
            Vector3 spawnPos = hitInfo.point;
            spawnPos.x = 0; // 固定x轴位置,符合你的需求
            Instantiate(ballPrefab, spawnPos, ballPrefab.transform.rotation);
        }
    }
}

方式2:直接计算x=0平面的交点(无需场景碰撞体)

如果你不想依赖场景里的碰撞体,可以通过数学计算直接得到鼠标在x=0平面上的对应点:

[SerializeField]
private GameObject ballPrefab;

void Update()
{
    if (Input.GetButtonDown("Fire1"))
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        // 计算射线与x=0平面的交点参数t
        float t = -ray.origin.x / ray.direction.x;
        // 获取交点位置
        Vector3 spawnPos = ray.GetPoint(t);
        Instantiate(ballPrefab, spawnPos, ballPrefab.transform.rotation);
    }
}

这个方法直接通过射线的数学公式计算,不需要场景里有任何Collider,完全适配你要固定x=0的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 19:55:12