我如何获得鼠标在地形上的位置点击?
How can i get mouse position click on terrain?
脚本附加到的相机高于地形从顶部看地形。现在,当我单击鼠标时,我得到了列表点。但现在我想做的是,当我点击鼠标时,它会给我在地形上的位置,包括像山丘这样的地形高处。
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);
}
}
}
}
你可以用 Raycast 来做到这一点,你可以从相机位置向地形投射光线,然后使用你得到的数据获得你想要的所有细节。
所以在你的情况下,如果你想将命中点添加到列表中,你可以这样做
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 Physics Raycast.
的文档页面
如果您想了解更多关于 Raycasting 的信息,我建议您观看有关该主题的 official Unity video,其中有更详细的介绍,您将在游戏开发中大量使用它,因此值得学习在继续之前尽可能多地了解它。
脚本附加到的相机高于地形从顶部看地形。现在,当我单击鼠标时,我得到了列表点。但现在我想做的是,当我点击鼠标时,它会给我在地形上的位置,包括像山丘这样的地形高处。
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);
}
}
}
}
你可以用 Raycast 来做到这一点,你可以从相机位置向地形投射光线,然后使用你得到的数据获得你想要的所有细节。
所以在你的情况下,如果你想将命中点添加到列表中,你可以这样做
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 Physics Raycast.
的文档页面如果您想了解更多关于 Raycasting 的信息,我建议您观看有关该主题的 official Unity video,其中有更详细的介绍,您将在游戏开发中大量使用它,因此值得学习在继续之前尽可能多地了解它。