运行时,如果一个物体不添加Collider组件就没有办法被鼠标点击,LineRenderer由于其Mesh会随着摄像机朝向变化,如果要通过添加MeshCollider来使其能够与鼠标交互,就需要不断同步更新其MeshCollider网格。

        代码参考如下:

using UnityEngine;

public class LineCollider : MonoBehaviour
{
	[SerializeField]
	LineRenderer lineRenderer;

	[SerializeField]
	MeshCollider meshCollider;

	void Start()
	{
		SetLineMeshCollider();
	}

	void Update()
	{
		SetLineMeshCollider();
	}

	void SetLineMeshCollider()
	{
		Mesh mesh = new();
		lineRenderer.BakeMesh(mesh, false);

		//LineRenderer使用的Mesh中的顶点坐标是基于世界(World)坐标的,而MeshCollider使用的是基于自身(Object)坐标的,需要转换一下。
		Vector3[] vs = mesh.vertices;
		Transform tranLine = lineRenderer.transform;
		for (int i = 0; i < vs.Length; i++)
		{
			vs[i] = tranLine.InverseTransformPoint(vs[i]);
		}
		mesh.SetVertices(vs);

		Mesh meshPre = meshCollider.sharedMesh;
		meshCollider.sharedMesh = mesh;
		//将原来使用的Mesh要销毁一下,否则会内存溢出。
		if (meshPre) Destroy(meshPre);
	}
}

Logo

一站式 AI 云服务平台

更多推荐