Esempio n. 1
0
    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);
        }
    }