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; } }