using System.Collections.Generic; using UnityEngine; using Drawing; namespace Drawing.Examples { /// Simple bezier curve editor [HelpURL("http://arongranberg.com/aline/documentation/stable/curveeditor.html")] public class CurveEditor : MonoBehaviour { List curves = new List(); Camera cam; public Color curveColor; class CurvePoint { public Vector2 position, controlPoint0, controlPoint1; } void Awake () { cam = Camera.main; } void Update () { // Add a new control point when clicking if (Input.GetKeyDown(KeyCode.Mouse0)) { curves.Add(new CurvePoint { position = (Vector2)Input.mousePosition, controlPoint0 = Vector2.zero, controlPoint1 = Vector2.zero, }); } // Keep adjusting the position of the control point while the mouse is pressed if (curves.Count > 0 && Input.GetKey(KeyCode.Mouse0) && ((Vector2)Input.mousePosition - curves[curves.Count - 1].position).magnitude > 2*2) { var point = curves[curves.Count - 1]; point.controlPoint1 = (Vector2)Input.mousePosition - point.position; point.controlPoint0 = -point.controlPoint1; } Render(); } void Render () { // Use a custom builder which renders even in standalone games // and in the editor even if gizmos are disabled. // Usually you would use the static Draw class instead. using (var draw = DrawingManager.GetBuilder(true)) { // Draw the curves in 2D using pixel coordinates using (draw.InScreenSpace(cam)) { // Draw a circle at each curve control point for (int i = 0; i < curves.Count; i++) { draw.xy.Circle((Vector3)curves[i].position, 2, Color.blue); } // Draw each bezier curve segment for (int i = 0; i < curves.Count - 1; i++) { var p0 = curves[i].position; var p1 = p0 + curves[i].controlPoint1; var p3 = curves[i+1].position; var p2 = p3 + curves[i+1].controlPoint0; draw.Bezier((Vector3)p0, (Vector3)p1, (Vector3)p2, (Vector3)p3, curveColor); } } } } } }