#region UsingStatements using UnityEngine; using System; using System.Collections; #endregion /// /// - Helper class for storing and manipulating Bezier Point data /// - Ensures that handles are in correct relation to one another /// - Handles adding/removing self from curve point lists /// - Calls SetDirty() on curve when edited /// [Serializable] public class BezierPoint : MonoBehaviour{ #region PublicEnumerations /// /// - Enumeration describing the relationship between a point's handles /// - Connected : The point's handles are mirrored across the point /// - Broken : Each handle moves independently of the other /// - None : This point has no handles (both handles are located ON the point) /// public enum HandleStyle { Connected, Broken, None, } #endregion #region PublicProperties /// /// - Curve this point belongs to /// - Changing this value will automatically remove this point from the current curve and add it to the new one /// [SerializeField] private BezierCurve _curve; public BezierCurve curve { get{return _curve;} set { if(_curve) _curve.RemovePoint(this); _curve = value; _curve.AddPoint(this); } } /// /// - Value describing the relationship between this point's handles /// public HandleStyle handleStyle; /// /// - Shortcut to transform.position /// /// /// - The point's world position /// public Vector3 position { get { return transform.position; } set { transform.position = value; } } /// /// - Shortcut to transform.localPosition /// /// /// - The point's local position. /// public Vector3 localPosition { get { return transform.localPosition; } set { transform.localPosition = value; } } /// /// - Local position of the first handle /// - Setting this value will cause the curve to become dirty /// - This handle effects the curve generated from this point and the point proceeding it in curve.points /// [SerializeField] private Vector3 _handle1; public Vector3 handle1 { get { return _handle1; } set { if(_handle1 == value) return; _handle1 = value; if(handleStyle == HandleStyle.None) handleStyle = HandleStyle.Broken; else if(handleStyle == HandleStyle.Connected) _handle2 = -value; _curve.SetDirty(); } } /// /// - Global position of the first handle /// - Ultimately stored in the 'handle1' variable /// - Setting this value will cause the curve to become dirty /// - This handle effects the curve generated from this point and the point proceeding it in curve.points /// public Vector3 globalHandle1 { get{return transform.TransformPoint(handle1);} set{handle1 = transform.InverseTransformPoint(value);} } /// /// - Local position of the second handle /// - Setting this value will cause the curve to become dirty /// - This handle effects the curve generated from this point and the point coming after it in curve.points /// [SerializeField] private Vector3 _handle2; public Vector3 handle2 { get { return _handle2; } set { if(_handle2 == value) return; _handle2 = value; if(handleStyle == HandleStyle.None) handleStyle = HandleStyle.Broken; else if(handleStyle == HandleStyle.Connected) _handle1 = -value; _curve.SetDirty(); } } /// /// - Global position of the second handle /// - Ultimately stored in the 'handle2' variable /// - Setting this value will cause the curve to become dirty /// - This handle effects the curve generated from this point and the point coming after it in curve.points /// public Vector3 globalHandle2 { get{return transform.TransformPoint(handle2);} set{handle2 = transform.InverseTransformPoint(value);} } #endregion #region PrivateVariables /// /// - Used to determine if this point has moved since the last frame /// private Vector3 lastPosition; #endregion #region MonoBehaviourFunctions void Update() { if(!_curve.dirty && transform.position != lastPosition) { _curve.SetDirty(); lastPosition = transform.position; } } #endregion }