예제 #1
0
        private Vector3 GetCurvePoint(float distance, bool updateMapIndex)
        {
            int   index           = curveDistanceMapIndex;
            float segmentDistance = platformObject.curveIndexDistanceMap[index];

            if (distance > segmentDistance && index < platformObject.curveIndexDistanceMap.Count - 1)
            {
                index++;
                if (updateMapIndex)
                {
                    curveDistanceMapIndex = index;
                }
            }
            float time = 0;

            if (index > 0)
            {
                float prevDistance = platformObject.curveIndexDistanceMap[index - 1];
                time = (distance - prevDistance) / (platformObject.curveIndexDistanceMap[index] - prevDistance);
            }
            else
            {
                time = distance / platformObject.curveIndexDistanceMap[index];
            }
            time = Mathf.Clamp01(time);

            Vector3 p0, p1, p2;

            if (index == 0)
            {
                p0 = platformObject.controlPoints[index];
            }
            else
            {
                p0 = (platformObject.controlPoints[index] + platformObject.controlPoints[index + 1]) / 2;
            }
            p1 = platformObject.controlPoints[index + 1];
            if (index + 2 == platformObject.controlPoints.Count - 1)
            {
                p2 = platformObject.controlPoints[index + 2];
            }
            else
            {
                p2 = (platformObject.controlPoints[index + 1] + platformObject.controlPoints[index + 2]) / 2;
            }

            return(platformObject.GetTransform().TransformPoint(InfiniteRunnerStarterPackUtility.CalculateBezierPoint(p0, p1, p2, time)));
        }
        private void ComputeBezierCurve(bool draw /*if false, will compute length*/)
        {
            PlatformObject platformObject = (PlatformObject)target;

            if (platformObject.controlPoints == null || platformObject.controlPoints.Count < 3)
            {
                platformObject.curveLength = 0;
                EditorUtility.SetDirty(target);
                return;
            }

            if (!draw)
            {
                platformObject.curveIndexDistanceMap = new List <float>();
            }

            Vector3 p0, p1, p2;
            Vector3 q0, q1;
            float   t;
            float   length = 0;

            Handles.color = Color.white;
            Vector3 platformPosition = platformObject.transform.position;

            for (int i = 0; i < platformObject.controlPoints.Count - 2; ++i)
            {
                if (i == 0)
                {
                    p0 = platformObject.controlPoints[i];
                }
                else
                {
                    p0 = (platformObject.controlPoints[i] + platformObject.controlPoints[i + 1]) / 2;
                }
                p1 = platformObject.controlPoints[i + 1];
                if (i + 2 == platformObject.controlPoints.Count - 1)
                {
                    p2 = platformObject.controlPoints[i + 2];
                }
                else
                {
                    p2 = (platformObject.controlPoints[i + 1] + platformObject.controlPoints[i + 2]) / 2;
                }

                t  = 0;
                q0 = InfiniteRunnerStarterPackUtility.CalculateBezierPoint(p0, p1, p2, t);
                for (int j = 1; j <= StepCount; j++)
                {
                    t  = j / (float)StepCount;
                    q1 = InfiniteRunnerStarterPackUtility.CalculateBezierPoint(p0, p1, p2, t);
                    if (draw)
                    {
                        Handles.DrawLine(platformPosition + q0, platformPosition + q1);
                    }
                    else
                    {
                        length += Vector3.Distance(q0, q1);
                    }
                    q0 = q1;
                }
                if (!draw)
                {
                    platformObject.curveIndexDistanceMap.Add(length);
                }
            }

            if (!draw)
            {
                platformObject.curveLength = length;
                EditorUtility.SetDirty(target);
            }
        }