コード例 #1
0
        /// <summary>
        /// Returns a position on the spline at the given percentage.
        /// </summary>
        public Vector3 GetPosition(float percentage, bool normalized = true)
        {
            if (normalized)
            {
                percentage = Reparam(percentage);
            }

            //evaluate curve:
            CurveDetail curveDetail = GetCurve(percentage);

            //avoid an error in editor usage where this index can be -1:
            if (curveDetail.currentCurve < 0)
            {
                return(Vector3.zero);
            }

            SplineAnchor startAnchor = Anchors[curveDetail.currentCurve];
            SplineAnchor endAnchor   = Anchors[curveDetail.currentCurve + 1];

            return(BezierCurves.GetPoint(startAnchor.Anchor.position, endAnchor.Anchor.position, startAnchor.OutTangent.position, endAnchor.InTangent.position, curveDetail.currentCurvePercentage, true, 100));
        }
コード例 #2
0
        /// <summary>
        /// Makes a spline longer.
        /// </summary>
        public GameObject[] AddAnchors(int count)
        {
            //refs:
            GameObject anchorTemplate = Resources.Load("Anchor") as GameObject;

            //create return array:
            GameObject[] returnObjects = new GameObject[count];

            for (int i = 0; i < count; i++)
            {
                //previous anchor refs:
                Transform previousPreviousAnchor = null;
                Transform previousAnchor         = null;
                if (Anchors.Length == 1)
                {
                    previousPreviousAnchor = transform;
                    previousAnchor         = Anchors[0].transform;
                }
                else if (Anchors.Length > 1)
                {
                    previousPreviousAnchor = Anchors[Anchors.Length - 2].transform;
                    previousAnchor         = Anchors[Anchors.Length - 1].transform;
                }

                //create a new anchor:
                GameObject newAnchor = Instantiate <GameObject>(anchorTemplate);
                newAnchor.name = newAnchor.name.Replace("(Clone)", "");
                SplineAnchor anchor = newAnchor.GetComponent <SplineAnchor>();
                anchor.tangentMode           = defaultTangentMode;
                newAnchor.transform.parent   = transform;
                newAnchor.transform.rotation = Quaternion.LookRotation(transform.forward);

                //tilt tangents for variety as we add new anchors:
                //anchor.Tilt (new Vector3 (0, 0, 0));
                anchor.InTangent.Translate(Vector3.up * .5f);
                anchor.OutTangent.Translate(Vector3.up * -.5f);

                //position new anchor:
                if (previousPreviousAnchor != null && previousAnchor != null)
                {
                    //determine direction for next placement:
                    Vector3 direction = (previousAnchor.position - previousPreviousAnchor.position).normalized;
                    if (direction == Vector3.zero)
                    {
                        direction = transform.forward;
                    }

                    //place from the previous anchor in the correct direction:
                    newAnchor.transform.position = previousAnchor.transform.position + (direction * 1.5f);
                }
                else
                {
                    newAnchor.transform.localPosition = Vector3.zero;
                }

                //catalog this new anchor for return:
                returnObjects[i] = newAnchor;
            }

            return(returnObjects);
        }