unity获取离鼠标最近的模型顶点 并进行画线测距操作
本文主要记录在开发过程中的问题以及解决过程
网上查找和对比了各种资料,关于顶点获取和画线测距的描述和代码都不太满足需求,所以结合资源和自己的思路,整理出来一条可能不是最优解,但是准确性没毛病。
采用方法:1.mesh网格遍历查找离鼠标位置最近的顶点
2.LineRenderer 画线
unity画线基础知识请百度,直接上代码
首先对line做一些基础设置
public Vector3[] vectors;
private Camera camera;
private LineRenderer line;
void Start()
{
camera = gameObject.GetComponent<Camera>();
vectors = new Vector3[2];//存储顶点
line = this.gameObject.AddComponent<LineRenderer>();
//只有设置了材质 setColor才有作用
line.material = new Material(Shader.Find("Sprites/Default"));
line.positionCount = 3;//设置两点
line.startColor = Color.yellow; //设置直线颜色
line.endColor = Color.yellow;
line.startWidth = 0.0003f;//设置直线宽度
line.endWidth = 0.0003f;
}
其次是线段起点和终点获取
ray = camera.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit, 100))
{
if (Input.GetMouseButtonDown(0))
{
Mesh mesh0 = hit.transform.GetComponent<MeshFilter>().mesh;
Transform transform = hit.transform;
//获取Mesh网格的所有顶点
Vector3[] vertices = mesh0.vertices;
p0 = transform.TransformPoint(vertices[0]);
//while循环 对比查找离鼠标在模型上的点击位置最近的顶点
while (i < vertices.Length - 1)
{
i++;
if ((hit.point - p0).sqrMagnitude > (hit.point - transform.TransformPoint(vertices[i])).sqrMagnitude)
{
p0 = transform.TransformPoint(vertices[i]);
}
}
i = 0;
}
}
最后是生成线段并测距
float destance = vectors[1].x - vectors[0].x, vectors[1].y - vectors[0].y, vectors[1].z - vectors[0].z, (vectors[1] - vectors[0]).magnitude
line.SetPositions(vectors);