- Home /
A* - Enemy Pathfinding away from Player
I would like to navigate the enemy away from the player if in a certain proximity and not move if it goes off the detection. I've thought of pushing the enemy to the opposite direction of the player, but I would like it to pathfind it's way behind a corner for example.
It will be used for "ranged" enemies, that try to stay @ range as much as possible so they can shoot with ranged weapons. They also have a trigger for whenever they get disturbed by the player and that's when they start attacking him.
Currently the enemies only detect when player is in range and start hugging him.
Trigger script: (has only range detection for when the player is close enough to start going after him)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyRangedTrigger : MonoBehaviour
{
[SerializeField] private float _rangeOn = 5, _rangeOff = 10;
private float _distance, x, y;
private Rigidbody2D _rb;
[SerializeField] private Rigidbody2D _player;
void Awake()
{
_rb = GetComponent<Rigidbody2D>();
}
void Update()
{
x = Mathf.Abs(_player.transform.position.x - _rb.transform.position.x);
y = Mathf.Abs(_player.transform.position.y - _rb.transform.position.y);
_distance = Mathf.Sqrt(x*x + y+y);
Trigger();
Untrigger();
}
void Trigger(){
if(_distance <= _rangeOn){
this.GetComponent<EnemyAI>().enabled = true;
}
}
void Untrigger(){
if(_distance >= _rangeOff){
this.GetComponent<EnemyAI>().enabled = false;
_rb.velocity = Vector2.zero;
}
}
}
The EnemyAI script:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Pathfinding;
public class EnemyAI : MonoBehaviour
{
[SerializeField] private Transform _target;
[SerializeField] private float _speed = 300f;
[SerializeField] private float _nextWaypointDistance = 3f;
Path path;
int currentWaypoint = 0;
bool reachedEndOfPath = false;
private Seeker _seeker;
private Rigidbody2D _rb;
void Start()
{
_seeker = GetComponent<Seeker>();
_rb = GetComponent<Rigidbody2D>();
InvokeRepeating("UpdatePath", 0f, 0.5f);
_seeker.StartPath(_rb.position, _target.position, OnPathComplete);
}
void FixedUpdate()
{
if (path == null) return;
if(currentWaypoint >= path.vectorPath.Count)
{
reachedEndOfPath = true;
return;
}else
{
reachedEndOfPath = false;
}
Vector2 direction = ((Vector2)path.vectorPath[currentWaypoint] - _rb.position).normalized;
_rb.velocity = direction * _speed * Time.deltaTime;
float distance = Vector2.Distance(_rb.position, path.vectorPath[currentWaypoint]);
if (distance < _nextWaypointDistance)
{
currentWaypoint++;
}
}
void OnPathComplete(Path p)
{
if(!p.error)
{
path = p;
currentWaypoint = 0;
}
}
void UpdatePath(){
if (_seeker.IsDone()) _seeker.StartPath(_rb.position, _target.position, OnPathComplete);
}
}
Seeker script is the script in the A* package - AstarPathfindingProject/Core/AI/Seeker.cs (version: 4.2.17)
Your answer
Follow this Question
Related Questions
How to make enemies take wider routes? 1 Answer
Astar Pathfinding with unity 2d 1 Answer