使用lineRender的时候需要在摄像机上加上组件linerender 可以调节粗细颜色之类
可以简单下面方法测试
void Start () { lineRenderer = gameObject.GetComponent<LineRenderer>(); lineRenderer.SetVertexCount(5); } void Update () { lineRenderer.SetPosition (0, new Vector3 (-1, 1, 0)); lineRenderer.SetPosition (1, new Vector3 (1, 1, 0)); lineRenderer.SetPosition (2, new Vector3 (1, -1, 0)); lineRenderer.SetPosition (3, new Vector3 (-1, -1, 0)); lineRenderer.SetPosition (4, new Vector3 (-1, 1, 0)); }可能画面里面看不到,因为在组件上没有材质
下面是简单画线代码
public class drawLine : MonoBehaviour { LineRenderer lineRenderer; int i = 0; void Start () { lineRenderer = gameObject.GetComponent<LineRenderer>(); } void Update () { if(Input.GetMouseButton(0)) { i++; lineRenderer.SetVertexCount(i); lineRenderer.SetPosition(i-1,Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x,Input.mousePosition.y,10))); } } }但是可以发现严重的问题就是有锯齿,所以这里最好用Vectrosity来解决
可以使用这里的
http://blog.csdn.net/taotaoah/article/details/50607444
可以在drawlinestouch的例子上加line.joins = Joins.Weld;
但是Vectrosity是使用另一个摄像机的,所以要截屏的比较困难
所以下面要用的是贝塞尔曲线方式
using UnityEngine; using System.Collections; using System.Collections.Generic; public class BezierPath { public List<Vector3> pathPoints; private int segments; public int pointCount; public BezierPath() { pathPoints = new List<Vector3>(); pointCount = 100;//最大点数 } public void DeletePath() { pathPoints.Clear (); } //t就是两点之间几分之几的位置 Vector3 BezierPathCalculation(Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, float t) { float tt = t * t; float ttt = t * tt; float u = 1.0f - t; float uu = u * u; float uuu = u * uu; Vector3 B = new Vector3(); B = uuu * p0; B += 3.0f * uu * t * p1; B += 3.0f * u * tt * p2; B += ttt * p3; return B; } public List<Vector3> CreateCurve(List<Vector3> controlPoints) { segments = controlPoints.Count / 3;//以3为间隔进行平滑 算出分段数量 pointCount = controlPoints.Count;//这里最大点数就是本身 for (int s = 0; s < controlPoints.Count -3; s+=3)//以3为间隔遍历所有点 { Vector3 p0 = controlPoints[s]; Vector3 p1 = controlPoints[s+1]; Vector3 p2 = controlPoints[s+2]; Vector3 p3 = controlPoints[s+3]; //第一个点的处理 if(s == 0) { pathPoints.Add(BezierPathCalculation(p0, p1, p2, p3, 0.0f)); } // for (int p = 0; p < (pointCount/segments); p++) { float t = (1.0f / (pointCount/segments)) * p; Vector3 point = new Vector3 (); point = BezierPathCalculation (p0, p1, p2, p3, t); pathPoints.Add (point); } } return pathPoints; } }
using UnityEngine; using System.Collections; using System.Collections.Generic; public class DrawLine : MonoBehaviour { // Use this for initialization private List<Vector3> list; private bool IsDraw = false; private LineRenderer lineRenderer; void Start () { lineRenderer = gameObject.GetComponent<LineRenderer>(); } // Update is called once per frame void Update() { if (Input.GetMouseButtonDown(1)) { if (list == null) list = new List<Vector3>(); list.Clear(); IsDraw = true; lineRenderer.SetVertexCount(0); } if (Input.GetMouseButton(1)) { list.Add(Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x,Input.mousePosition.y,10))); } if (Input.GetMouseButtonUp(1)) { IsDraw = false; } drawBezierCurve(); //drawInputPointCurve(); } private void drawBezierCurve() { if(IsDraw&&list.Count>0){ List<Vector3> bcList; // BezierCurve bc= new BezierCurve(); BezierPath bc= new BezierPath(); //bcList = bc.CreateCurve(list);// 通过贝塞尔曲线 平滑 bcList = bc.CreateCurve(list);// 通过贝塞尔曲线 平滑 lineRenderer.SetVertexCount(bcList.Count); for (int i = 0; i < bcList.Count; i++) { Vector3 v = bcList[i]; v += new Vector3(0, 0.5f, 0); lineRenderer.SetPosition(i, v); } } } //普通没有使用贝塞尔的情况 private void drawInputPointCurve() { if (IsDraw && list.Count > 0) { lineRenderer.SetVertexCount(list.Count); for (int i = 0; i < list.Count; i++) { Vector3 v = list[i]; v += new Vector3(0, 0.5f, 0); lineRenderer.SetPosition(i, v); } } } }
可以看到图片那种锯齿会少很多,当然还有很多改进的地方,比如加上抗锯齿啊,使用贴图或者rendertexture之类
但是由于项目不同,不是每个方法都能用,要看自己斟酌
最后吐糟下unity的linerenderer,也没有2D版的,没法设置corner或者joint
其实还有的方法就是放弃unity自带的linerenderer而使用自己写mesh的方式进行,这样可以更好平滑