Esempio n. 1
0
 public void SetCurve(CatmullRomCurve pCurve, float pProgress)
 {
     _curve    = pCurve;
     _progress = pProgress;
     transform.localPosition = _curve.GetPointOnPath(pProgress);
 }
Esempio n. 2
0
    void OnSceneGUI()
    {
        if (_target.enabled)
        {
            if (_target.nodes.Count > 0)
            {
                bool dirty = false;

                //allow path adjustment undo:
                Undo.RecordObject(_target, "Adjust Curve");

                //node handle display:
                Vector3 newWorldPosition;
                Vector3 oldWorldPosition;

                for (int i = 0; i < _target.nodes.Count; i++)
                {
                    if (_target.isLocal)
                    {
                        oldWorldPosition = _target.transform.TransformPoint(_target.nodes[i]);
                    }
                    else
                    {
                        oldWorldPosition = _target.nodes[i];
                    }

                    if (i == 0)
                    {
                        Handles.Label(oldWorldPosition, "Begin", style);
                    }

                    if (i == _target.nodes.Count - 1)
                    {
                        Handles.Label(oldWorldPosition, "End", style);
                    }

                    newWorldPosition = Handles.PositionHandle(oldWorldPosition, Quaternion.identity);

                    if (newWorldPosition != oldWorldPosition)
                    {
                        dirty = true;
                    }

                    if (_target.isLocal)
                    {
                        _target.nodes[i] = _target.transform.InverseTransformPoint(newWorldPosition);
                    }
                    else
                    {
                        _target.nodes[i] = newWorldPosition;
                    }
                }

                if (dirty)
                {
                    _curve = _target.GetWorldSpaceCurve();
                }

                Vector3 prevPt = _curve.GetPointOnPath(0);
                Handles.color = _target.pathColor;
                int numLines = _target.nodes.Count * _target.smoothAmount;
                for (int i = 1; i <= numLines; i++)
                {
                    float   pm     = (float)i / numLines;
                    Vector3 currPt = _curve.GetPointOnPath(pm);
                    Handles.DrawLine(currPt, prevPt);
                    prevPt = currPt;
                }
            }
        }
    }