Unity 使用LineRenderer绘制贝塞尔曲线
LineRenderer介绍
LineRenderer线渲染器,在三维空间中渲染线段和曲线段。
贝塞尔曲线介绍
通过很少的控制点,生成复杂的平滑曲线。
一阶贝塞尔曲线:B(t) = (1 - t) * p0 + t*p1,t ∈[0, 1];
二阶贝塞尔曲线:B(t) = (1 - t)^2P0 + 2t(1 - t)p1 + t^2p2,t∈ [0, 1];
三阶贝塞尔曲线:B(t) = P0(1 - t)^3 + 3P1t(1 - t)^2 + 3P2t^2(1 - t) + p3t^3,t∈[0, 1];
创建LineRenderer渲染线
如图在场景中创建一个Line
然后挂上自己写的脚本TestLine.cs
创建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;
}
}
效果如下:
使用LineRenderer注意事项
LineRenderer可以设置Color时,可以设置startColor和endColor。
在新建LineRenderer组件的时候,我们可以看到它带有默认的材质球Default-Line,使用这个材质球我们可以轻松的设置开始的颜色和末尾的颜色。
如果使用自己创建的标准材质球,在设置startColor和endColor的时候就不会生效。
原因在于两个材质球所使用的Shader不一样,
Default-Line使用的默认Shader是:Legacy Shaders/Particles/Alpha Blended Premultiply
我们使用这个Shader就可以轻松设置startColor和endColor