网上看了一些文章,基本是在UGUI上和三维控件上绘制线条,如果OnGUI上存在图层绘制,就会造成这两种方式的线条被覆盖,所以尝试在OnGUI中使用Graphics绘制线条,使用鼠标点击就能绘制两点之间的线条,截图和核心代码做个心得记录和分享,如果网友有更好的方式,请指点一二!
1)函数调用部分
// 显示线条
if (showRoutesFlag)
{
List<Point2D> routesLinePoint = null;
for (int i = 0; i < routesPoints.Count - 1; ++i)
{
// UnityEdit绘制线条
//Vector3 lerpVector = Vector3.Lerp(routesPoints[i], routesPoints[i + 1], 0.5f);
//Handles.DrawBezier(routesPoints[i], routesPoints[i + 1], lerpVector, lerpVector, Color.red, null, routesWidth);
// 计算routesPoints[i]和routesPoints[i + 1]之间的线点
routesLinePoint = FigureUpCreateRouteLinePoints(routesPoints[i], routesPoints[i + 1], routesWidth / 2);
// 绘制所有的线点
if (rotesLinePoint != null)
{
foreach (var point in routesLinePoint)
{
Graphics.DrawTexture(new Rect((float)point.X, (float)point.Y, routesWidth, routesWidth), rotesLinePoint);
}
}
}
}
2)函数实现部分
/// <summary>
/// 计算两个点之间所有的线点
/// </summary>
/// <param name="start">开始点</param>
/// <param name="end">结束点</param>
/// <param name="thickness">点像素,一个航线点所占像素个数</param>
/// <returns></returns>
List<Point2D> FigureUpCreateRouteLinePoints(Vector3 start, Vector3 end, float thickness)
{
if (thickness <= 1)
{
thickness = 2;
}
List<Point2D> linePoints = new List<Point2D>();
float k = 0;
float b = 0;
Vector3 s_Point = end.x > start.x ? start : end;
Vector3 e_Point = end.x > start.x ? end : start;
k = (e_Point.y - s_Point.y) / (e_Point.x - s_Point.x);
b = s_Point.y - k * s_Point.x;
int xMax = (int)Math.Abs(e_Point.x - s_Point.x);
int yMax = (int)Math.Abs(e_Point.y - s_Point.y);
int pointNum = xMax > yMax ? xMax : yMax;
pointNum /= (int)thickness;
double convertThickness = (double)(e_Point.x - s_Point.x) / pointNum;
for (int i = 0; i < pointNum; i++)
{
Point2D point2D = new Point2D(s_Point.x + i * convertThickness, k * (s_Point.x + i * convertThickness) + b);
linePoints.Add(point2D);
}
return linePoints;
}
3)效果图