Unity采用Graphics绘制二维线条

 网上看了一些文章,基本是在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)效果图

猜你喜欢

转载自blog.csdn.net/weixin_39638287/article/details/127969633
今日推荐