1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
| using System.Collections; using System.Collections.Generic; using UnityEngine;
public class NewBehaviourScript : MonoBehaviour { public Transform[] arrTf ;
public Transform tf; private float runTime;
void Start() { }
void Update() { this.runTime += Time.deltaTime;
if (this.runTime >= 1) { this.runTime -= 1; }
List<Transform> listTf = new List<Transform>(this.arrTf); Vector3 v3 = Bezier(this.runTime, listTf);
this.tf.position = v3;
}
public Vector3 Bezier(Vector3 p0, Vector3 p1, float t) { return (1 - t) * p0 + t * p1; }
public Vector3 Bezier(Vector3 p0, Vector3 p1, Vector3 p2, float t) { Vector3 p0p1 = (1 - t) * p0 + t * p1; Vector3 p1p2 = (1 - t) * p1 + t * p2; Vector3 result = (1 - t) * p0p1 + t * p1p2; return result; }
public Vector3 Bezier(Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, float t) { Vector3 result; Vector3 p0p1 = (1 - t) * p0 + t * p1; Vector3 p1p2 = (1 - t) * p1 + t * p2; Vector3 p2p3 = (1 - t) * p2 + t * p3; Vector3 p0p1p2 = (1 - t) * p0p1 + t * p1p2; Vector3 p1p2p3 = (1 - t) * p1p2 + t * p2p3; result = (1 - t) * p0p1p2 + t * p1p2p3; return result; }
public Vector3 Bezier(float t, List<Vector3> p) { if (p.Count < 2) return p[0];
List<Vector3> newp = new List<Vector3>(); for (int i = 0; i < p.Count - 1; i++) { Vector3 p0p1 = (1 - t) * p[i] + t * p[i + 1]; newp.Add(p0p1); }
return Bezier(t, newp); }
public Vector3 Bezier(float t, List<Transform> p) { if (p.Count < 2) return p[0].position; List<Vector3> newp = new List<Vector3>(); for (int i = 0; i < p.Count; i++) { newp.Add(p[i].position); } return Bezier(t, newp); }
private void OnDrawGizmos() { if (this.arrTf.Length < 4) { return; }
for(int i = 0; i < this.arrTf.Length; i++) { if(this.arrTf[i] == null) { return; } }
List<Transform> listTf = new List<Transform>(this.arrTf);
for(float i = 0; i < 1; i+= 0.01f) {
Vector3 v3 = Bezier(i, listTf); Vector3 v4 = Bezier(i + 0.01f, listTf);
Gizmos.DrawLine(v3, v4); }
} }
|