Search Unity

What's the best way to set a destination for a retreating enemy?

Discussion in 'Navigation' started by PencilManners, Jul 24, 2020.

  1. PencilManners

    PencilManners

    Joined:
    May 7, 2016
    Posts:
    14
    I have an enemy that wants to keep it's distance from the player so whenever they get too close, the enemy picks a position a set distance behind them, checks if there's a viable path and sets it as a new destination for the NavAgent.

    Code (CSharp):
    1. public void Retreat()
    2.     {
    3.         //If the skeleton is already far enough from the player when this is called (from taking a hit), ignore it
    4.         float DistanceBetweenTarget = Vector3.Distance(transform.position, PlayerTarget.position);
    5.         if(DistanceBetweenTarget > MaxDistance)
    6.         {
    7.             return;
    8.         }
    9.  
    10.         //Debug.Log("I gotta get outta here!");
    11.         Vector3 RetreatDirection = transform.forward * -1 * RetreatDistance;
    12.         Vector3 FirstDestination = transform.position + RetreatDirection;
    13.  
    14.         SetPath(FirstDestination);
    15.     }
    16.  
    17. private void SetPath(Vector3 Destination)
    18.     {
    19.         //Check if the destination is on the navmesh
    20.         NavMeshHit Hit;
    21.         bool NavMeshFound = NavMesh.SamplePosition(Destination, out Hit, 1.0f, NavMesh.AllAreas);
    22.  
    23.         if (NavMeshFound == true)
    24.         {
    25.             //Check if there's a viable path
    26.             NavMeshPath Path = new NavMeshPath();
    27.             NavAgent.CalculatePath(Hit.position, Path);
    28.             if (Path.status != NavMeshPathStatus.PathInvalid)
    29.             {
    30.                 NavAgent.SetDestination(Hit.position);
    31.                 Moving = true;
    32.             }
    33.         }
    34.     }
    This is of course pretty basic and there are plenty of situations where it gives up on running away because its back is facing a wall or it's on an elevated platform and isn't considering jumping down. I'm not sure how to handle this because I usually know the destination in advance, is there any good videos on pathfinding that cover this situation?.
     
  2. vasanijeet48

    vasanijeet48

    Joined:
    Mar 29, 2020
    Posts:
    6
    Hey!!
    I wanted the same results soo I added an empty gameObject behind the enemy and added a mesh to it and baked a navmesh. So now whenever the enemy is too close then it sets destination to that gameobject