// 成员变量
public Canvas canvas;
public Material material;
private LineRenderer lr;
private PolygonCollider2D pc;
private Vector3 mousePos;
private bool mousePressing = false;
private List<Vector3> points = new List<Vector3>();
// update方法
void Update()
{
if (mousePressing)
{
Vector3 newPos;
RectTransformUtility.ScreenPointToWorldPointInRectangle(canvas.GetComponent<RectTransform>(), Input.mousePosition, Camera.main, out newPos);
if (Vector3.Distance(mousePos, newPos) > 0.3)
{
points.Add(newPos);
}
}
if (!mousePressing && Input.GetMouseButtonDown(0))
{
GameObject gameObject = new GameObject();
lr = gameObject.AddComponent<LineRenderer>();
pc = gameObject.AddComponent<PolygonCollider2D>();
mousePressing = true;
mousePos = Input.mousePosition;
}
if (Input.GetMouseButtonUp(0))
{
mousePressing = false;
lr.positionCount = points.Count;
lr.SetPositions(points.ToArray());
lr.material = material;
List<Vector2> colliderPath = GetColliderPath();
pc.SetPath(0, colliderPath.ToArray());
points.Clear();
}
}
// 给线加PolygonCollider碰撞体
List<Vector2> GetColliderPath()
{
var colliderWidth = lr.startWidth;
var points2 = new List<Vector2>();
points2.Clear();
for (int i = 0; i < points.Count; i++)
{
points2.Add(points[i]);
}
List<Vector2> edgePointList = new List<Vector2>();
for (int j = 1; j < points2.Count; j++)
{
Vector2 distanceVector = points2[j - 1] - points2[j];
Vector3 crossVector = Vector3.Cross(distanceVector, Vector3.forward);
Vector2 offectVector = crossVector.normalized;
Vector2 up = points2[j - 1] + 0.5f * colliderWidth * offectVector;
Vector2 down = points2[j - 1] - 0.5f * colliderWidth * offectVector;
edgePointList.Insert(0, down);
edgePointList.Add(up);
if (j == points2.Count - 1)
{
up = points2[j] + 0.5f * colliderWidth * offectVector;
down = points2[j] - 0.5f * colliderWidth * offectVector;
edgePointList.Insert(0, down);
edgePointList.Add(up);
}
}
return edgePointList;
}
给LineRenderer加碰撞体是借鉴这位博主的代码
【Unity】根据LineRenderer形状给物体添加PolygonCollider2D碰撞体 - 萧然CS - 博客园 (cnblogs.com)