本人已参与「新人创作礼」活动,一起开启掘金创作之路。
我软件中的需求是,鼠标点击二维界面的位置要生成两个点,然后要在两个点直接连线。因此,我在我函数中传入两个GameObject(需要连线的两个点),然后返回出线的长度和需要旋转的方向。(PS:我的线是挂在第一点下的子物体,用image直接形成的,线的尺寸如下图)
但是,此方法不适用于画多点多线的情景,因为每一次画线时,都会生成新的物体,由此导致unity运行卡顿。因此,在又多线多点的需求时,可以采用Vectrosity这个插件,进行绘制,关于这个插件的使用,我之后会出详细的文章进行说明,和大家一同解决unity中UI画线的问题。
画线代码如下:
public void drawLine(GameObject ICO1, GameObject ICO2, out double length, out double angel)
{
Vector2 position1 = ICO1.transform.localPosition;//获得第一个点的二维坐标
Vector2 position2 = ICO2.transform.localPosition;//获得第二个点的二维坐标
float xValue = 0, yValue = 0;
//根据两点的位置关系,进行计算
if ((position1.x > 0 && position2.x > 0) || (position1.x < 0 && position2.x < 0))
xValue = Mathf.Abs(position1.x - position2.x);
else
xValue = Mathf.Abs(position1.x) + Mathf.Abs(position2.x);
if ((position1.y > 0 && position2.y > 0) || (position1.y < 0 && position2.y < 0))
yValue = Mathf.Abs(position1.y - position2.y);
else
yValue = Mathf.Abs(position1.y) + Mathf.Abs(position2.y);
length = Mathf.Sqrt(xValue * xValue + yValue * yValue);
if (position1.x <= position2.x && position1.y <= position2.y)
angel = -90 + Mathf.Atan(yValue / xValue) / Mathf.PI * 180;
else if (position1.x >= position2.x && position1.y <= position2.y)
angel = 90 - Mathf.Atan(yValue / xValue) / Mathf.PI * 180;
else if(position1.x >= position2.x && position1.y >= position2.y)
angel = 90 + Mathf.Atan(yValue / xValue) / Mathf.PI * 180;
else
angel = -90 - Mathf.Atan(yValue / xValue) / Mathf.PI * 180;
}
最后画出图的效果如下:
补充:多人询问的unity中自带的lineRender画线工具,在此统一回复:lindeRender用于三维场景中画线,如果需要二维,则需要将三维的去掉一个轴线,然后用照相机投放到UI界面中即可。