private void LateUpdate() { float t = NormalizedT; BezierSplineAdvanced spline = Spline; bool forward = MovingForward; for (int i = 0; i < tailObjects.Count; i++) { Transform tailObject = tailObjects[i]; float dt = Time.deltaTime; if (forward) { tailObject.position = spline.MoveAlongSpline(ref t, -tailObjectDistances[i]); if (lookForward) { tailObject.rotation = Quaternion.Lerp(tailObject.rotation, Quaternion.LookRotation(spline.GetTangent(t)), rotationLerpModifier * dt); } } else { tailObject.position = spline.MoveAlongSpline(ref t, tailObjectDistances[i]); if (lookForward) { tailObject.rotation = Quaternion.Lerp(tailObject.rotation, Quaternion.LookRotation(-spline.GetTangent(t)), rotationLerpModifier * dt); } } } }
public static void DrawSplineDetailed(BezierSplineAdvanced spline) { if (spline.Count < 2) { return; } BezierPoint endPoint0 = null, endPoint1 = null; for (int i = 0; i < spline.Count - 1; i++) { endPoint0 = spline[i]; endPoint1 = spline[i + 1]; DrawBezier(endPoint0, endPoint1); } if (spline.loop && endPoint1 != null) { DrawBezier(endPoint1, spline[0]); } // Draw tangent lines on scene view //Color _tmp = Handles.color; //Handles.color = Color.cyan; //for( float i = 0f; i < 1f; i += 0.05f ) //{ // Handles.DrawLine( spline.GetPoint( i ), spline.GetPoint( i ) + spline.GetTangent( i ) ); //} //Handles.color = _tmp; }
void OnEnable() { spline = target as BezierSplineAdvanced; spline.Refresh(); Undo.undoRedoPerformed -= OnUndoRedo; Undo.undoRedoPerformed += OnUndoRedo; }
void OnEnable() { point = target as BezierPoint; spline = point.GetComponentInParent <BezierSplineAdvanced>(); if (spline != null && !spline.Equals(null)) { spline.Refresh(); } Undo.undoRedoPerformed -= OnUndoRedo; Undo.undoRedoPerformed += OnUndoRedo; }
static void DrawSplineGizmo(BezierSplineAdvanced spline, GizmoType gizmoType) { if (spline.Count < 2) { return; } Gizmos.color = SPLINE_GIZMO_COLOR; Vector3 lastPos = spline[0].position; float increaseAmount = 1f / (spline.Count * SPLINE_GIZMO_SMOOTHNESS); for (float i = increaseAmount; i < 1f; i += increaseAmount) { Vector3 pos = spline.GetPoint(i); Gizmos.DrawLine(lastPos, pos); lastPos = pos; } Gizmos.DrawLine(lastPos, spline.GetPoint(1f)); }
public static void DrawSplineInspectorGUI(BezierSplineAdvanced spline) { if (spline.Count < 2) { if (GUILayout.Button("Initialize Spline")) { spline.Reset(); } return; } Color c = GUI.color; EditorGUI.BeginChangeCheck(); bool loop = EditorGUILayout.Toggle("Loop", spline.loop); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(spline, "Toggle Loop"); spline.loop = loop; SceneView.RepaintAll(); } EditorGUI.BeginChangeCheck(); bool drawGizmos = EditorGUILayout.Toggle("Draw Runtime Gizmos", spline.drawGizmos); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(spline, "Toggle Draw Gizmos"); spline.drawGizmos = drawGizmos; SceneView.RepaintAll(); } EditorGUILayout.Space(); GUI.color = AUTO_CONSTRUCT_SPLINE_BUTTON_COLOR; if (GUILayout.Button("Construct Linear Path")) { for (int i = 0; i < spline.Count; i++) { Undo.RecordObject(spline[i], "Construct Linear Path"); } spline.ConstructLinearPath(); SceneView.RepaintAll(); } if (GUILayout.Button("Auto Construct Spline")) { for (int i = 0; i < spline.Count; i++) { Undo.RecordObject(spline[i], "Auto Construct Spline"); } spline.AutoConstructSpline(); SceneView.RepaintAll(); } if (GUILayout.Button("Auto Construct Spline (method #2)")) { for (int i = 0; i < spline.Count; i++) { Undo.RecordObject(spline[i], "Auto Construct Spline"); } spline.AutoConstructSpline2(); SceneView.RepaintAll(); } GUI.color = c; }