My enemies never go on patrol. They follow me and when I outrun them then finally stop and get suspicious but they then never go to patrol. I have checked my code against the repo and all seems exactly the same so I’m stumped. Any help would be greatly appreciated.
Here’s my code for the AIController:
using UnityEngine;
using RPG.Combat;
using RPG.Core;
using RPG.Movement;
namespace RPG.Control
{
public class AIController : MonoBehaviour
{
[SerializeField] float chaseDistance = 5f;
[SerializeField] float suspicionTime = 3f;
[SerializeField] PatrolPath patrolPath;
[SerializeField] float waypointTolerance = 1f;
[SerializeField] float waypointDwellTime = 3f;
Fighter fighter;
GameObject player;
Health health;
Mover mover;
Vector3 guardPosition;
float timeSinceLastSawPlayer = Mathf.Infinity;
int currentWaypointIndex = 0;
float timeSinceArrivedAtWaypoint = Mathf.Infinity;
private void Start()
{
fighter = GetComponent<Fighter>();
// need to get hold of the Player - best option is to use the Tag system
player = GameObject.FindWithTag("Player");
health = GetComponent<Health>();
mover = GetComponent<Mover>();
// Guard position is the starting position of the guard
guardPosition = transform.position;
}
private void Update()
{
if (health.IsDead()) return;
if (InAttackRangeOfPlayer() && fighter.CanAttack(player))
{
AttackBehaviour();
}
else if (timeSinceLastSawPlayer < suspicionTime)
{
SuspicionBehaviour();
}
else
{
PatrolBehaviour();
}
UpdateTimers();
}
private void UpdateTimers()
{
timeSinceLastSawPlayer += Time.deltaTime;
timeSinceArrivedAtWaypoint += Time.deltaTime;
}
private void PatrolBehaviour()
{
Vector3 nextPosition = guardPosition;
if (patrolPath != null)
{
if (AtWaypoint())
{
timeSinceArrivedAtWaypoint = 0;
CycleWaypoint();
}
nextPosition = GetCurrentWaypoint();
}
if(timeSinceArrivedAtWaypoint < waypointDwellTime)
{
if(timeSinceArrivedAtWaypoint > waypointDwellTime)
{
mover.StartMoveAction(nextPosition);
}
}
}
private Vector3 GetCurrentWaypoint()
{
return patrolPath.GetWaypoint(currentWaypointIndex);
}
private void CycleWaypoint()
{
currentWaypointIndex = patrolPath.GetNextIndex(currentWaypointIndex);
}
private bool AtWaypoint()
{
float distanceToWaypoint = Vector3.Distance(transform.position, GetCurrentWaypoint());
return distanceToWaypoint < waypointTolerance;
}
private void SuspicionBehaviour()
{
GetComponent<ActionScheduler>().CancelCurrentAction();
}
private void AttackBehaviour()
{
timeSinceLastSawPlayer = 0;
fighter.Attack(player);
}
private bool InAttackRangeOfPlayer()
{
float distanceToPlayer = Vector3.Distance(player.transform.position, transform.position);
return distanceToPlayer < chaseDistance;
}
// called by Unity
private void OnDrawGizmosSelected()
{
Gizmos.color = Color.blue;
Gizmos.DrawWireSphere(transform.position, chaseDistance);
}
}
}
PatrolPath:
using UnityEngine;
namespace RPG.Control
{
public class PatrolPath : MonoBehaviour
{
const float waypointGizmoRadius = 0.3f;
private void OnDrawGizmos()
{
for (int i = 0; i < transform.childCount; i++)
{
int j = GetNextIndex(i);
Gizmos.DrawSphere(GetWaypoint(i), waypointGizmoRadius);
Gizmos.DrawLine(GetWaypoint(i), GetWaypoint(j));
}
}
public int GetNextIndex(int i)
{
if (i + 1 == transform.childCount)
{
return 0;
}
return i + 1;
}
public Vector3 GetWaypoint(int i)
{
return transform.GetChild(i).position;
}
}
}