- Home /
Move towards the player only when the path is not invalid or partial
I want the AI to move towards the player, however if the path to the player is impartial or invalid (basically meaning the player is behind defences), the AI would first target the closest destructableGameobject(barricade) and destroy it, then check if the path is now valid would path towards the player again, however this works, but after arriving at the gameobject, he starts walking between the player.position and the gameobject.position.
void Update()
{
//If there is a target player and if AI is alive
if (playerHealth.HealthAsPercentage > 0 && enemyHealth.HealthAsPercentage > 0)
{
status = agent.pathStatus;
//Give Ai a path to begin with
if (!agent.hasPath)
{
agent.SetDestination(player.transform.position);
}
//Current status of the agents path
//If the destination is the player
if (agent.destination == player.transform.position)
{
//Can the ai get to the player?
if (status != NavMeshPathStatus.PathComplete)
{
FindClosestDestructableObject();
}
return;
}
//Target is not the player
if(agent.destination != player.transform.position)
{
//Is there a path to player
agent.SetDestination(player.transform.position); //Set destination to player, to be able to check if it has a working path
if(status != NavMeshPathStatus.PathComplete) //If the path doesnt return completable set path to player
{
FindClosestDestructableObject(); //Find the closest destructable and destroy it
}
else //Move to player because the path is completeable
{
return;
}
}
print(status);
anim.SetBool("IsMoving", true);
}
}
private void FindClosestDestructableObject()
{
//Ai finds next target which is barricades
//Find Destructible objects and destroy until path is obtainable
DestructableObject[] objects = FindObjectsOfType<DestructableObject>();
GameObject closestObj = null;
foreach (DestructableObject obj in objects)
{
//If there is no closest obj the first obj is set to the closest
if (closestObj == null)
{
closestObj = obj.gameObject;
}
//Find which is the closest object, Is the current object closer than the currentClosestObj
if (Vector3.Distance(transform.position, obj.transform.position) <= Vector3.Distance(transform.position, closestObj.transform.position))
{
closestObj = obj.gameObject;
}
}
//Target the nearest object to path to
agent.SetDestination(closestObj.transform.position);;
}
Your answer
Follow this Question
Related Questions
Modify NavMeshPath for Tactical FPS (slicing the pie/sweeping maneuver) 0 Answers
Get NavMeshAgent to look where it's going 0 Answers
NavMesh - Different NavMeshAgent radius for gaps vs platforms 0 Answers
How to make AICharacterController able to walk on walls and ceilings? 0 Answers
Nav Mesh Agent Not Moving Despite Successfully Creating a Path 0 Answers