Проблема в основном это:
LineRenderer пытается соединить красные точки. Это создание зеленых вершин для создания сетки. Так что сегмент верхней линии выглядит великолепно. Но тогда LineRenderer пытается быть экономным, он использует вершины от конца одного отрезка в конце второго отрезка. Когда есть острый угол, вы получаете проблему, которую видите. Второй отрезок линии зажимается на пересечении, потому что его «концевая заглушка» не перпендикулярна другой «концевой заглушке».
Решение состоит в том, чтобы создать свой собственный рендер, а не сделать его таким экономичным. Вы можете сделать это, создав динамическую сетку . Сетка будет состоять из серии тонких четырехугольников. Для каждого отрезка линии вы можете вычислить четыре угла четырехугольника, вычислив нормаль линии и заданную ширину линии:
Vector3 normal = Vector3.Cross(start, end);
Vector3 side = Vector3.Cross(normal, end-start);
side.Normalize();
Vector3 a = start + side * (lineWidth / 2);
Vector3 b = start + side * (lineWidth / -2);
Vector3 c = end + side * (lineWidth / 2);
Vector3 d = end + side * (lineWidth / -2);
Здесь a
, b
, c
и d
составляет четыре угла одного сегмента линии, так же как и зеленые точки на изображении выше. Эти вершины будут добавлены в сетку, и вы также добавите индексы, чтобы превратить четыре вершины в два треугольника (таким образом, будет добавлено шесть индексов, abc и bdc).
Это, очевидно, может быть довольно сложным. Я полагаю, что еще одна причина, по которой Unity реализовал свой LineRenderer так, как они это сделали, заключалась в том, что это было сделано, чтобы избежать другой проблемы - углов. Когда вы начнете рисовать каждый отрезок линии, вы увидите, где два отрезка соединяются и образуют некрасивое соединение. Есть способы справиться с этим, рассчитав общий нормаль между обеими линиями и обновив их вершины до общего нормального значения, но это только частично решает проблему, так как вы все равно можете легко получить сжатые линии. Наиболее надежным решением является создание дополнительных вершин в соединениях, которые будут выступать в качестве углов.