Unity 使用LineRenderer绘制贝塞尔曲线

Unity 使用LineRenderer绘制贝塞尔曲线

LineRenderer介绍

LineRenderer线渲染器,在三维空间中渲染线段和曲线段。

贝塞尔曲线介绍

通过很少的控制点,生成复杂的平滑曲线。

Unity 使用LineRenderer绘制贝塞尔曲线_第1张图片
一阶贝塞尔曲线:B(t) = (1 - t) * p0 + t*p1,t ∈[0, 1];

Unity 使用LineRenderer绘制贝塞尔曲线_第2张图片
二阶贝塞尔曲线:B(t) = (1 - t)^2P0 + 2t(1 - t)p1 + t^2p2,t∈ [0, 1];

Unity 使用LineRenderer绘制贝塞尔曲线_第3张图片
三阶贝塞尔曲线:B(t) = P0(1 - t)^3 + 3P1t(1 - t)^2 + 3P2t^2(1 - t) + p3t^3,t∈[0, 1];

Unity 使用LineRenderer绘制贝塞尔曲线_第4张图片

创建LineRenderer渲染线

如图在场景中创建一个Line

Unity 使用LineRenderer绘制贝塞尔曲线_第5张图片
然后挂上自己写的脚本TestLine.cs
Unity 使用LineRenderer绘制贝塞尔曲线_第6张图片

创建TestLine.cs脚本

随着时间的增长,逐渐计算生成贝塞尔曲线上的点,然后绘制出来
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestLine : MonoBehaviour
{
	private LineRenderer lineRenderer;
	private Vector3 p0;
	private Vector3 p1;
	private Vector3 p2;
	private Vector3 result;
	private List<Vector3> resultList = new List<Vector3> ();
	private float time = 0;
	private float timeLerp;
	private float maxTime = 1f;
	void Start() {
		lineRenderer = gameObject.GetComponent<LineRenderer> ();
		lineRenderer.startColor = new Color(1f, 1f, 0f, 0.5f);
		lineRenderer.endColor = new Color (0f, 1f, 1f, 0.5f);
		lineRenderer.startWidth = 0.02f;
		lineRenderer.endWidth = 0.02f;
		
		p0 = new Vector3 (-5, 0, 0);
		p1 = new Vector3 (0, 5, 0);
		p2 = new Vector3 (5, 0, 0);
	}
	void FixedUpdate(){
		if (time > maxTime) {
            		return;
        	}

		CalculatePosition();

		lineRenderer.positionCount = resultList.ToArray ().Length;
		if (lineRenderer.positionCount >= 2) {
			lineRenderer.SetPoitions (resultList.ToArray ());
		}
	}
	void CalculatePosition(){
		result = new Vector3 ();
		timeLerp = Mathf.Lerp (0, 1, time / maxTime);
		result.x = Mathf.Pow (1 - timeLerp, 2) * p0.x + 2 * timeLerp * Mathf.Pow (1 - timeLerp, 1) * p1.x + Mathf.Pow (timeLerp, 2) * p2.x;
        	result.y = Mathf.Pow (1 - timeLerp, 2) * p0.y + 2 * timeLerp * Mathf.Pow (1 - timeLerp, 1) * p1.y + Mathf.Pow (timeLerp, 2) * p2.y;
        	result.z = Mathf.Pow (1 - timeLerp, 2) * p0.z + 2 * timeLerp * Mathf.Pow (1 - timeLerp, 1) * p1.z + Mathf.Pow (timeLerp, 2) * p2.z;
        	resultList.Add(result);
        	time = time + Time.deltaTime;
	}
}

效果如下:

Unity 使用LineRenderer绘制贝塞尔曲线_第7张图片

使用LineRenderer注意事项

LineRenderer可以设置Color时,可以设置startColor和endColor。
在新建LineRenderer组件的时候,我们可以看到它带有默认的材质球Default-Line,使用这个材质球我们可以轻松的设置开始的颜色和末尾的颜色。

在这里插入图片描述
如果使用自己创建的标准材质球,在设置startColor和endColor的时候就不会生效。
原因在于两个材质球所使用的Shader不一样,
Unity 使用LineRenderer绘制贝塞尔曲线_第8张图片
Default-Line使用的默认Shader是:Legacy Shaders/Particles/Alpha Blended Premultiply
我们使用这个Shader就可以轻松设置startColor和endColor

你可能感兴趣的:(Unity)