繁体   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