C# 如何在地形上单击鼠标位置?

C# 如何在地形上单击鼠标位置?,c#,unity3d,unity5,C#,Unity3d,Unity5,脚本附加到的摄影机位于地形上方,从顶部查看地形。现在,当我点击鼠标时,我得到了列表点。但现在我想做的是,当我点击鼠标时,它会给我在地形上的位置,包括地形高地,比如丘陵 using System.Collections; using System.Collections.Generic; using UnityEngine; public class GetMousePosition : MonoBehaviour { private bool isMousePressed; p

脚本附加到的摄影机位于地形上方,从顶部查看地形。现在,当我点击鼠标时,我得到了列表点。但现在我想做的是,当我点击鼠标时,它会给我在地形上的位置,包括地形高地,比如丘陵

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GetMousePosition : MonoBehaviour
{
    private bool isMousePressed;
    private List<Vector3> pointsList;
    private Vector3 mousePos;

    // Use this for initialization
    void Start()
    {
        isMousePressed = false;
        pointsList = new List<Vector3>();
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            isMousePressed = true;
            pointsList.RemoveRange(0, pointsList.Count);
        }
        else if (Input.GetMouseButtonUp(0))
        {
            isMousePressed = false;
        }

        if (isMousePressed)
        {            
            mousePos = GetComponent<Camera>().ScreenToWorldPoint(Input.mousePosition);
            mousePos.z = 0;
            if (!pointsList.Contains(mousePos))
            {
                pointsList.Add(mousePos);
            }
        }
    }
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类GetMousePosition:MonoBehavior
{
私人住宅;
私有列表点列表;
私人矢量3鼠标;
//用于初始化
void Start()
{
isMousePressed=false;
pointsList=新列表();
}
//每帧调用一次更新
无效更新()
{
if(Input.GetMouseButtonDown(0))
{
isMousePressed=true;
pointsList.RemoveRange(0,pointsList.Count);
}
else if(Input.GetMouseButtonUp(0))
{
isMousePressed=false;
}
如果(按下按钮)
{            
mousePos=GetComponent().ScreenToWorldPoint(Input.mousePosition);
mousePos.z=0;
如果(!pointsList.Contains(鼠标点))
{
pointsList.Add(鼠标点);
}
}
}
}

如果使用一个,您可以从相机位置向地形投射光线,然后使用返回的数据获取所需的所有细节

因此,在您的情况下,如果您想将生命点添加到列表中,您可以这样做

float distance = 100f;

// Update is called once per frame
void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        isMousePressed = true;
        pointsList.RemoveRange(0, pointsList.Count);
    }
    else if (Input.GetMouseButtonUp(0))
    {
        isMousePressed = false;
    }

    if (isMousePressed)
    {            
        Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
        RaycastHit hit;

         if (Physics.Raycast (ray, out hit, distance)) 
         {
             if(!pointsList.Contains(hit.point)
             {
                 pointsList.Add(hit.point); 
             }           
         }    
    }
}
在上面的示例中应该注意到,Physics.Raycast有许多重载,允许您自定义光线的激发方式。您还可以使用hit和ray变量获取更多信息,例如它所击中的特定碰撞器以及光线起源的世界位置,有关如何执行此操作的更多信息可以在的Unity API文档页面中找到

如果您想了解更多有关光线投射的信息,我建议您观看关于该主题的更多详细信息,您将在游戏开发中大量使用它,因此在继续之前,尽可能多地了解它是值得的。

您可以使用,您可以将光线从摄影机位置投射到地形,然后使用返回的数据获取所需的所有细节

因此,在您的情况下,如果您想将生命点添加到列表中,您可以这样做

float distance = 100f;

// Update is called once per frame
void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        isMousePressed = true;
        pointsList.RemoveRange(0, pointsList.Count);
    }
    else if (Input.GetMouseButtonUp(0))
    {
        isMousePressed = false;
    }

    if (isMousePressed)
    {            
        Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
        RaycastHit hit;

         if (Physics.Raycast (ray, out hit, distance)) 
         {
             if(!pointsList.Contains(hit.point)
             {
                 pointsList.Add(hit.point); 
             }           
         }    
    }
}
在上面的示例中应该注意到,Physics.Raycast有许多重载,允许您自定义光线的激发方式。您还可以使用hit和ray变量获取更多信息,例如它所击中的特定碰撞器以及光线起源的世界位置,有关如何执行此操作的更多信息可以在的Unity API文档页面中找到


如果您想了解更多有关光线投射的信息,我建议您观看关于该主题的,您将在游戏开发中大量使用它,因此在继续之前,您需要尽可能多地了解它。

您要搜索的术语是raycast。谢谢,它成功了。您要搜索的术语是raycast。谢谢,它成功了。