Exemple #1
0
        public override void Constrain()
        {
            if (pathGiver == null || pathGiver == null || pathGiver.Count == 0)
            {
                Clear();
                return;
            }


            prevMaxCost = MaxCost.Value;

            if (PathAvailable == null && PathUnavailable == null)
            {
                OnActivate.ExtendedInvoke(this);
            }

            pathAvailableTMP.Clear();
            pathUnavailableTMP.Clear();

            float currentCost = 0;

            if (pathGiver.Count == 1)
            {
                pathAvailableTMP.Add(pathGiver[0]);
            }
            else
            {
                for (int i = 1; i < pathGiver.Count; i++)
                {
                    float   prevCost = currentCost;
                    Vector3 distance = pathGiver[i] - pathGiver[i - 1];
                    float   cost     = distance.magnitude;
                    currentCost += cost;

                    if (prevCost <= MaxCost.Value)
                    {
                        pathAvailableTMP.Add(pathGiver[i - 1]);

                        if (currentCost > MaxCost.Value)
                        {
                            float   availableCost = cost - (currentCost - MaxCost.Value);
                            Vector3 clampedPos    =
                                pathGiver[i - 1] + Vector3.ClampMagnitude(distance, availableCost);

                            pathAvailableTMP.Add(clampedPos);
                            pathUnavailableTMP.Add(clampedPos);
                        }
                    }
                    else
                    {
                        pathUnavailableTMP.Add(pathGiver[i - 1]);
                    }

                    if (i == pathGiver.Count - 1)
                    {
                        if (currentCost <= MaxCost.Value)
                        {
                            pathAvailableTMP.Add(pathGiver[i]);
                        }
                        else
                        {
                            pathUnavailableTMP.Add(pathGiver[i]);
                        }
                    }
                }


                CurrentlyUsedCost = Mathf.Min(MaxCost.Value, currentCost);
                PathAvailable     = pathAvailableTMP.ToArray();
                PathUnavailable   = pathUnavailableTMP.ToArray();

                Vector3 newPos = PathAvailable.Length > 0
                    ? PathAvailable[PathAvailable.Length - 1]
                    : PathUnavailable[0];
                //if (IgnoreYAxis)
                //    newPos.y = myTransform.position.y;

                transformToConstrain.position = newPos;
            }
        }