[英]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.