draw_parabola.cs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class draw_parabola : MonoBehaviour
  5. {
  6. public Transform startTrans;
  7. public Transform endTrans;
  8. public LineRenderer lineRender;
  9. Vector3[] path;
  10. void Start()
  11. {
  12. draw_parabola_true(startTrans.position, endTrans.position, 10, 5);
  13. }
  14. /// <summary>
  15. /// 绘制抛物线
  16. /// </summary>
  17. /// <param name="startPoint">初始点</param>
  18. /// <param name="endPoint">结束点</param>
  19. /// <param name="resolution">路径点数量</param>
  20. void draw_parabola_true(Vector3 startPoint, Vector3 endPoint, int resolution, float height)
  21. {
  22. var bezierControlPoint = (startPoint + endPoint) * 0.5f + (Vector3.up * height);
  23. path = new Vector3[resolution];//resolution为int类型,表示要取得路径点数量,值越大,取得的路径点越多,曲线最后越平滑
  24. for (int i = 0; i < resolution; i++)
  25. {
  26. var t = (i + 1) / (float)resolution;//归化到0~1范围
  27. path[i] = GetBezierPoint(t, startPoint, bezierControlPoint, endPoint);//使用贝塞尔曲线的公式取得t时的路径点
  28. }
  29. lineRender.positionCount = path.Length;
  30. lineRender.SetPositions(path);
  31. }
  32. /// <param name="t">0到1的值,0获取曲线的起点,1获得曲线的终点</param>
  33. /// <param name="start">曲线的起始位置</param>
  34. /// <param name="center">决定曲线形状的控制点</param>
  35. /// <param name="end">曲线的终点</param>
  36. public static Vector3 GetBezierPoint(float t, Vector3 start, Vector3 center, Vector3 end)
  37. {
  38. return (1 - t) * (1 - t) * start + 2 * t * (1 - t) * center + t * t * end;
  39. }
  40. }