LineRenderer 线渲染器
属性
SetWidth
设置线的开始和结束的宽度。
SetColors
设置线的开始和结束的颜色。
SetVertexCount
设置线段数。
SetPosition
设置线段的位置。
useWorldSpace 如果启用,该线被定义在世界级坐标空间。
画线
bool isMouseDown;//鼠标是否按下; GameObject obj;// 有lineRender组件的预制体 List<Vector3> points = new List<Vector3>();//声明一个Vector类链表;存储点的坐标 // Use this for initialization void Start () { } // Update is called once per frame void Update () { if (Input.GetMouseButtonDown(0)) {//鼠标按下; points.Clear();//每次划线前清空数据,这样每次的线不会相互影响; obj = GameObject.Instantiate(Resources.Load("MyProjectRes/Huaduoxian2d1")) as GameObject; obj.transform.parent = MainUI.GetInstance.m_uiSelectParent.transform; isMouseDown = true; obj.transform.localScale = Vector3.one; } if (Input.GetMouseButtonUp(0)) {//鼠标抬起; isMouseDown = false; } if (isMouseDown) { Vector3 position = Input.mousePosition;//获取鼠标位置,属于二维坐标; position = Camera.main.ScreenToWorldPoint(position);//屏幕坐标转世界坐标,z轴为摄像机的; position.Set(position.x, position.y, 0f);//z轴远离摄像机,可以观察到; points.Add(position);//坐标存放在list中; Huaduoxin2d3 line1 = obj.GetComponent<Huaduoxin2d3>(); line1.Draw(points); } }
将上面脚本绑在主摄像机上
obj预制体上绑下面脚本,要有lineRender组件,这里加了边缘碰撞器,为了是线可以发生物理效果
LineRenderer line;//划线类; EdgeCollider2D edge;//边缘碰撞器; List<Vector2> points = new List<Vector2>();//声明一个二维链表; void Awake() { line = GetComponent<LineRenderer>(); edge=GetComponent<EdgeCollider2D>(); } // Use this for initialization void Start() { } // Update is called once per frame void Update (){ } public void Draw(List<Vector3> _points)//Draw方法; { //line.material = new Material(Shader.Find("Unlit/Transparent Colored")); line.SetVertexCount(_points.Count);//设置点数量; for (int i = 0; i < _points.Count; i++) { line.SetPosition(i, _points[i]);//每个赋值; points.Add(new Vector2(_points[i].x, _points[i].y));//添加; } if (points.Count > 1) edge.points = points.ToArray();//点数大于1就赋值给边缘碰撞其的数组; }
这样就可以实现画线在屏幕上,但是如果加上UI图片,线不能显示在图片了,被图片遮挡了,就是下面的效果
为了让线不被遮挡,我发现原因是因为UICamera的属性Clear Flags
Clear Flags 清除标记
相机在渲染时会存储颜色和深度信息。屏幕的未绘制部分是空的,默认情况下会显示天空盒。当你使用多个相机时,每一个都将自己的颜色和深度信息存储在缓冲区中,还将积累大量的每个相机的渲染数据。当场景中的任何特定相机进行渲染时,你可以设定清除标记以清除缓冲区信息的不同集合
Skybox 天空盒
默认设置。在屏幕上空的部分将显示当前相机的天空盒。如果当前相机没有设置天空盒,它会默认使用渲染设置(在Edit->Render Settings里)中选择的天空盒。然后它将退回使用背景颜色。
Solid Color 纯色
屏幕上的空的部分将显示当前相机的背景颜色。
Depth Only 仅深度
不同的深度显示的优先级不同,优先级高的会覆盖优先级低的物体,第一人称fps中,玩家手里的枪就是如此,纪要显示场景,又要显示枪,需要不同的深度去控制显示,设置一个深度为0的相机来绘制环境,还要另一个深度为1的相机单独绘制武器。该武器相机的清除标记应设置为仅深度。这将保持环境的图形显示在屏幕上,枪被绘制出来,不透明的部分将完全覆盖任何已绘制的事物
Don't Clear 不清除
不清除任何颜色或深度缓存。其结果是,每帧绘制在下一帧之上,造成涂片效果。最好是与自定义着色器一起使用
我选择了Don't Clear后画的线就会显示在图片上了