Пример #1
0
        public static bool Project(Vector3 worldPos, ref Vector3 projected, ref Rail currentRail, ref int currentIndex)
        {
            Debug.DrawRay(worldPos, Vector3.up, Color.gray);
            float   bestDistSqr   = float.MaxValue;
            Vector3 bestProjected = Vector3.zero;
            Rail    bestRail      = null;
            int     bestIndex     = 0;

            if (currentRail != null)
            {
                currentRail.ProjectSegment(worldPos, currentIndex, ref bestDistSqr, ref bestProjected, ref bestRail, ref bestIndex);
                Rail currentRail2  = currentRail;
                int  currentIndex2 = currentIndex;
                bool fwd           = true;
                for (int i = 0; i < 5; i++)
                {
                    if (!Next(ref currentRail2, ref currentIndex2, ref fwd))
                    {
                        break;
                    }
                    currentRail2.ProjectSegment(worldPos, currentIndex2, ref bestDistSqr, ref bestProjected, ref bestRail, ref bestIndex);
                }
                currentRail2  = currentRail;
                currentIndex2 = currentIndex;
                fwd           = false;
                for (int j = 0; j < 5; j++)
                {
                    if (!Next(ref currentRail2, ref currentIndex2, ref fwd))
                    {
                        break;
                    }
                    currentRail2.ProjectSegment(worldPos, currentIndex2, ref bestDistSqr, ref bestProjected, ref bestRail, ref bestIndex);
                }
                if (bestDistSqr > 1f)
                {
                    currentRail = null;
                }
            }
            if (currentRail == null)
            {
                for (int k = 0; k < all.Count; k++)
                {
                    for (int l = 0; l < all[k].points.Length - 1; l++)
                    {
                        all[k].ProjectSegment(worldPos, l, ref bestDistSqr, ref bestProjected, ref bestRail, ref bestIndex);
                    }
                }
            }
            if (bestDistSqr <= 1f)
            {
                currentRail  = bestRail;
                currentIndex = bestIndex;
                projected    = bestProjected;
                Debug.DrawRay(projected, Vector3.up, Color.green);
                return(true);
            }
            currentRail  = null;
            currentIndex = -1;
            projected    = Vector3.zero;
            return(false);
        }