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

