unity关于lineRender平滑画线问题

46 篇文章 2 订阅
34 篇文章 0 订阅

使用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));
        }

 
可能画面里面看不到,因为在组件上没有材质
一定要加sprite/default之类的材质的材质  不然可能看不见或者视觉效果不正常


下面是简单画线代码

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的方式进行,这样可以更好平滑

  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值