1、利用的 linerender
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class CurveLine : MonoBehaviour
{
private LineRenderer lineRenderer;
[Header("点数量")]
public int positionCount=50;
[Header("线宽")]
public float laserWidth;
[Header("材质")]
public Material laserMaterial;
public List<Transform> nodeList = new List<Transform>();
public List<float> laserWidthList = new List<float>();
public List<Vector3> v3s = new List<Vector3>();
private void Awake()
{
lineRenderer= GetComponent<LineRenderer>();
lineRenderer.startWidth = laserWidth;
lineRenderer.material= laserMaterial;
for (int i = 0; i < nodeList.Count; i++)
{
if (i == nodeList.Count - 1)
{
//Invoke("TT", 0.5f);
StartCoroutine(TT());return;
//依据 v3s 绘制曲线
}
DrawBezierCurve(nodeList[i].position, nodeList[i+1].position, laserWidthList[i]);
//lineRenderer.positionCount = v3s.Count;
}
}
private IEnumerator TT()
{
yield return new WaitForSeconds(0.5F);
for (int i = 0; i < v3s.Count; i++)
{
lineRenderer.positionCount= i+1;
lineRenderer.SetPosition(i, v3s[i]);
yield return new WaitForSeconds(0.01F);
}
//一次性绘制所有点
//lineRenderer.positionCount= v3s.Count;
//lineRenderer.SetPositions(v3s.ToArray());
}
private void DrawBezierCurve(Vector3 startPoint, Vector3 endPoint, float height)
{
// 计算控制点,起点和终点的中点向上偏移height,就是贝塞尔曲线高度 当前为左边偏移 up为上下偏移
Vector3 controlPoint = (startPoint + endPoint) / 2 + Vector3.left * height;
for (int i = 0; i < positionCount; i++)
{
//确定i在曲线上的位置 (0-1)
float t = i / (float)(positionCount - 1);
Vector3 point = CalculateQuadraticBezierPoint(t, startPoint, controlPoint, endPoint);
//lineRenderer.SetPosition(i, point); //设置第i位曲线点
v3s.Add(point);
}
}
//二次贝塞尔曲线公式,根据起点终点和控制点加权计算返回一个点
Vector3 CalculateQuadraticBezierPoint(float t, Vector3 startPoint, Vector3 controlPoint, Vector3 endPoint)
{
return (1 - t) * (1 - t) * startPoint +
2 * (1 - t) * t * controlPoint +
t * t * endPoint;
}
}
当前是 左右曲,要是实现上下曲需自己修改
Vector3.up
Vector3 controlPoint = (startPoint + endPoint) / 2 + Vector3.left * height;
注意
positionCount的数量,越大越精细