public Vector2 GetDesiredDestination(AIAgent requester) { Vector2 position = requester.transform.position; AIAgentData requesterData = requester.data; ITargetable target = requester.Target; if (target == null) { //Debug.LogError($"{requester} has no posible targets"); return(requester.parent.GetCohesionPosition(requester)); } Vector2 targetPos = target.GameObject.transform.position; Vector2 directionTowardsPosition = (position - targetPos).normalized; float requesterRadiousOffset = requesterData.shape == Shape.CIRCULAR ? requesterData.radious : Vector2Utilities.GetDistanceOfSquareEdgeAndCenterFromDirection(requesterData.radious, directionTowardsPosition); float targetRadiousOffset = target.BodyShape == Shape.CIRCULAR ? target.Radious : Vector2Utilities.GetDistanceOfSquareEdgeAndCenterFromDirection(target.Radious, directionTowardsPosition); Vector2 destinationPoint = targetPos + directionTowardsPosition * (requesterRadiousOffset + targetRadiousOffset); return(destinationPoint); }
protected float GetSeparationWeight(AIAgent requester, AIAgent closestSiblin, bool linear) { Vector2 position = requester.transform.position; Vector2 siblinPos = closestSiblin.transform.position; AIAgentData data = requester.data; return(GetWeight(position, siblinPos, data.radious * data.separationRangeInRadious, data.radious, linear)); }
public static Vector2 Arribe(AIAgent requester, Vector2 position, Vector2 destinationPoint, float deltaTime, bool decelerate = true, bool useStopRadious = true) { AIAgentData requesterData = requester.data; float sqrDist = Vector2Utilities.SqrDistance(destinationPoint, position); //in stop radious if (sqrDist <= Mathf.Pow(requesterData.stopRadious, 2) && useStopRadious) { return(position); } //in slow down radious else if (sqrDist < Mathf.Pow(requesterData.slowDownStartRadious, 2) && decelerate) { Vector2 direction = (destinationPoint - position).normalized; float dist = Mathf.Sqrt(sqrDist); float speedMult = dist / requesterData.slowDownStartRadious; float movementMagnitude = requesterData.maxSpeed * speedMult * deltaTime; //prevent overshooting if (dist <= movementMagnitude) { return(destinationPoint); } return(position + direction * movementMagnitude); } else { float dist = Mathf.Sqrt(sqrDist); float movementMagnitude = requesterData.maxSpeed * deltaTime; if (dist <= movementMagnitude) { return(destinationPoint); } Vector2 direction = (destinationPoint - position) / dist; return(position + direction * movementMagnitude); } }