[英]Why I can't get the position of plane on the terrain with mouse click?
我尝试过的:
在我添加的脚本顶部
[SerializeField] private LayerMask terrainLayer;
在检查器中,我在第 8 处添加了一个名为 Terrain 的新图层,然后将 Terrain 图层更改为 Terrain,并在此脚本的terrainLayer 变量中选择了 Terrain。
然后在 SpawnThroughPlane 方法中:
public void SpawnThroughPlane()
{
if (Input.GetMouseButtonDown(0))
{
RaycastHit hit;
//Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
var ray = new Ray(plane.transform.position, Vector3.down);
//if (plane.GetComponent<MeshCollider>().Raycast(ray, out hit, Mathf.Infinity))
if (Physics.Raycast(ray, out hit, Mathf.Infinity, terrainLayer))
{
cube = Instantiate(prefabToSpawn);
Vector3 pos = cube.transform.position;
pos.y = terrain.SampleHeight(cube.transform.position);
cube.transform.position = hit.point + pos;
}
}
}
结果是当我单击它时,无论我用鼠标单击何处,都会生成对象并在同一位置的一个位置显示对象。
完整脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
public class SpawnObjects : MonoBehaviour
{
public GameObject prefabToSpawn;
public Terrain terrain;
public CustomPlane plane;
public float yOffset = 0.5f;
[SerializeField] private LayerMask terrainLayer;
private float terrainWidth;
private float terrainLength;
private float xTerrainPos;
private float zTerrainPos;
private float planeWidth;
private float planeLength;
private float xPlanePos;
private float zPlanePos;
private float yValTerrain;
private float yValPlane;
private float randXTerrain;
private float randZTerrain;
private float randXPlane;
private float randZPlane;
private Collider terrainCollider;
void Awake()
{
if (terrain != null)
{
//Get terrain size
terrainWidth = terrain.terrainData.size.x;
terrainLength = terrain.terrainData.size.z;
//Get terrain position
xTerrainPos = terrain.transform.position.x;
zTerrainPos = terrain.transform.position.z;
terrainCollider = terrain.GetComponent<Collider>();
}
if (plane != null)
{
planeWidth = plane.width;
planeLength = plane.length;
xPlanePos = plane.transform.position.x;
zPlanePos = plane.transform.position.z;
}
}
private void Update()
{
SpawnThroughPlane();
}
public void SpawnThroughPlane()
{
if (Input.GetMouseButtonDown(0))
{
RaycastHit hit;
//Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
var ray = new Ray(plane.transform.position, Vector3.down);
//if (plane.GetComponent<MeshCollider>().Raycast(ray, out hit, Mathf.Infinity))
if (Physics.Raycast(ray, out hit, Mathf.Infinity, terrainLayer))
{
var prefab = Instantiate(prefabToSpawn);
Vector3 pos = prefab.transform.position;
pos.y = terrain.SampleHeight(prefab.transform.position);
prefab.transform.position = hit.point + pos;
}
}
}
}
如果plane.transform.position
不在屏幕(= PIXEL)空间中,则ScreenPointToRay
的使用没有多大意义。
您可能更愿意简单地使用
var ray = new Ray(plane.transform.position, Vector3.down);
并且如上所述,您无论如何都应该确保使用LayerMask
并且只允许光线投射通过给它一个专用层来击中地形,并在例如
[SerializeField] private LayerMask terrainLayer;
然后使用
if(Physics.Raycast(ray, out var hit, Mathf.infinity, terrainLayer))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.