using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; //[ExecuteInEditMode] public class PathManager : MonoBehaviour { public GameObject rootPoint; public Transform trans; public LineRenderer lineRenderer; private static PathManager Instance; // Use this for initialization public static PathManager GetInstance() { return Instance; } public BezierPathModel BezierPath; private void Awake() { Instance = this; } void Start() { if (!lineRenderer) { lineRenderer = gameObject.AddComponent<LineRenderer>(); } else { lineRenderer = gameObject.GetComponent<LineRenderer>(); } InitPath(); DrawCurve(BezierPath.PathTrans); //trans.DOPath(BezierPath.PathTrans,10); // trans.DOPath(BezierPath.PathTrans, 15, PathType.Linear, PathMode.Full3D); // rootPoint.DOPath(BezierPath.PathTrans, 15, PathType.Linear, PathMode.Full3D); } public void Update() { } void DrawCurve(List<Vector3> pos) { lineRenderer.positionCount = pos.Count; for (int i = 0; i < pos.Count; i++) { // float t = i / (float)pos.Count; // int nodeIndex = 0; // Debug.Log("i"+i); Vector3 pixel = pos[i]; //lineRenderer.positionCount = i; lineRenderer.SetPosition(i, pixel); } } public void InitPath() { BezierPath.PathTrans = calculate(BezierPath.ControlTrans, BezierPath.segmentNum); } public List<Vector3> calculate(List<Transform> poss, int precision) { //维度,坐标轴数(二维坐标,三维坐标...) int dimersion = 2; //贝塞尔曲线控制点数(阶数) int number = poss.Count; //控制点数不小于 2 ,至少为二维坐标系 if (number < 2 || dimersion < 2) return null; List<Vector3> result = new List<Vector3>(); //计算杨辉三角 int[] mi = new int[number]; mi[0] = mi[1] = 1; for (int i = 3; i <= number; i++) { int[] t = new int[i - 1]; for (int j = 0; j < t.Length; j++) { t[j] = mi[j]; } mi[0] = mi[i - 1] = 1; for (int j = 0; j < i - 2; j++) { mi[j + 1] = t[j] + t[j + 1]; } } //计算坐标点 for (int i = 0; i < precision; i++) { float t = (float)i / precision; Vector3 temp_ = new Vector3(0, 0, 0); for (int k = 0; k < number; k++) { temp_.x += Mathf.Pow(1 - t, number - k - 1) * poss[k].position.x * Mathf.Pow(t, k) * mi[k]; temp_.y += Mathf.Pow(1 - t, number - k - 1) * poss[k].position.y * Mathf.Pow(t, k) * mi[k]; temp_.z += Mathf.Pow(1 - t, number - k - 1) * poss[k].position.z * Mathf.Pow(t, k) * mi[k]; } result.Add(temp_); } return result; } public List<Vector3> ReturnPath(int id) { return BezierPath.PathTrans; } } [System.Serializable] public class BezierPathModel { public List<Transform> ControlTrans; public int segmentNum; public List<Vector3> PathTrans; }