Bezier.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. using UnityEngine;
  2. using System.Collections.Generic;
  3. using System.Collections;
  4. public class Bezier : MonoSingleton<Bezier>
  5. {
  6. public Transform[] controlPoints;
  7. public LineRenderer lineRenderer;
  8. private int layerOrder = 0;
  9. private int _segmentNum = 50;
  10. private float rr = 0.3f;
  11. public Transform point;
  12. private Vector2 Interval = new Vector2(0.05f, 0);
  13. private Material material;
  14. private Vector2 offset;
  15. // 0.3 弧度半径
  16. void Start()
  17. {
  18. material = lineRenderer.materials[0];
  19. if (!lineRenderer)
  20. {
  21. lineRenderer = GetComponent<LineRenderer>();
  22. }
  23. // lineRenderer.sortingLayerID = layerOrder;
  24. // DrawCurve();
  25. int index = 0;
  26. Debug.Log(lineRenderer.positionCount);
  27. lineRenderer.positionCount = (controlPoints.Length - 2) * _segmentNum + controlPoints.Length;
  28. lineRenderer.SetPosition(index++, controlPoints[0].position);
  29. for (int i = 1; i < controlPoints.Length-1; i++)
  30. {
  31. point.position = controlPoints[i].position;
  32. point.LookAt(controlPoints[i-1].position);
  33. point.Translate(0,0, rr, Space.Self);
  34. Vector3 pos1 = point.position;
  35. lineRenderer.SetPosition(index++, pos1);
  36. //GameObject obj = new GameObject(i.ToString());
  37. //obj.transform.position = point.position;
  38. //GameObject obj2 = new GameObject(i.ToString());
  39. //obj2.transform.position = controlPoints[i].position;
  40. point.position = controlPoints[i].position;
  41. point.LookAt(controlPoints[i+1].position);
  42. point.Translate(0, 0, rr+0.05f, Space.Self);
  43. Vector3 pos2 = point.position;
  44. Debug.Log(pos1 + " " + point.position + " " + pos2);
  45. List<Vector3> listPos = DrawCurve(pos1, controlPoints[i].position, pos2);
  46. for (int j = 0; j < listPos.Count; j++)
  47. {
  48. lineRenderer.SetPosition(index++, listPos[j]);
  49. }
  50. }
  51. lineRenderer.SetPosition(index++, controlPoints[controlPoints.Length-1].position);
  52. float dis = 0;
  53. for (int i = 0; i < lineRenderer.positionCount; i++)
  54. {
  55. dis += Vector3.Distance(lineRenderer.GetPosition(i), lineRenderer.GetPosition(i + 1));
  56. }
  57. material.SetTextureScale("_MainTex", new Vector2(dis*4, 1f));
  58. StartCoroutine(SetOffset());
  59. }
  60. public void SetRoute()
  61. {
  62. }
  63. private IEnumerator SetOffset()
  64. {
  65. while (true)
  66. {
  67. yield return new WaitForSeconds(0.04f);
  68. offset -= Interval;
  69. material.SetTextureOffset("_MainTex", offset);
  70. }
  71. }
  72. void Update()
  73. {
  74. // DrawCurve();
  75. }
  76. void DrawCurve()
  77. {
  78. for (int i = 1; i <= _segmentNum; i++)
  79. {
  80. float t = i / (float)_segmentNum;
  81. int nodeIndex = 0;
  82. Vector3 pixel = CalculateCubicBezierPoint(t, controlPoints[nodeIndex].position,
  83. controlPoints[nodeIndex + 1].position, controlPoints[nodeIndex + 2].position);
  84. lineRenderer.positionCount = i;
  85. lineRenderer.SetPosition(i - 1, pixel);
  86. }
  87. }
  88. List<Vector3> DrawCurve( Vector3 pos1,Vector3 pos2 ,Vector3 pos3)
  89. {
  90. List<Vector3> listPos = new List<Vector3>();
  91. for (int i = 1; i <= _segmentNum; i++)
  92. {
  93. float t = i / (float)_segmentNum;
  94. int nodeIndex = 0;
  95. Vector3 pixel = CalculateCubicBezierPoint(t, pos1,
  96. pos2, pos3);
  97. listPos.Add(pixel);
  98. }
  99. return listPos;
  100. }
  101. Vector3 CalculateCubicBezierPoint(float t, Vector3 p0, Vector3 p1, Vector3 p2)
  102. {
  103. float u = 1 - t;
  104. float tt = t * t;
  105. float uu = u * u;
  106. Vector3 p = uu * p0;
  107. p += 2 * u * t * p1;
  108. p += tt * p2;
  109. return p;
  110. }
  111. }