簡體   English   中英

為什么我不能通過鼠標點擊獲得飛機在地形上的位置?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM