Question by
z3r07 · Dec 15, 2018 at 10:05 AM ·
ainavmeshagent
Agent destination to last player position
Hi everyone I've a problem with my Chasing Behaviour script, so when the player is in Sight or Hear of View my agent is stopped for some seconds and then if the player is in sight yet will start the chasing, else the agent go to the last player position known. The problem is when my player is not more in Field of view and the agent continue to follow me.
private NavMeshAgent agent;
private Animator animator;
private FieldOfView sightFov;
private FieldOfView hearFov;
private bool isFirstAlert = true;
private bool isFirstAlertCoroutine = false;
private bool isBackToPatrolCoroutine = false;
private Transform lastPlayerPosition;
private Image alertMark;
public override void BuildTransitions() {
AddTransition(DoctorStateTransition.NO_PLAYER_IN_SIGHT, DoctorStateID.PATROL);
}
public override void Enter() {
agent = this.gameObject.GetComponent<NavMeshAgent>();
animator = this.gameObject.GetComponent<Animator>();
hearFov = this.gameObject.GetComponent<DoctorFSM>().hearFov;
sightFov = this.gameObject.GetComponent<DoctorFSM>().sightFov;
alertMark = this.gameObject.GetComponentInChildren<Image>();
}
public override void Update() {
//Individua il giocatore la prima volta
//Verifica che la coroutine sia ancora attiva a guarda il giocatore
if(!isFirstAlertCoroutine) {
StartCoroutine(FirstAlert());
if(hearFov.visibleTargets.Count > 0) {
lastPlayerPosition = hearFov.visibleTargets[0];
} else if(sightFov.visibleTargets.Count > 0) {
lastPlayerPosition = sightFov.visibleTargets[0];
}
} else {
//Inseguimento normale
//Controlla nel raggio uditivo
if(hearFov.visibleTargets.Count > 0) {
Debug.Log("Sentito");
}
//Controllo raggio visivo
else if(sightFov.visibleTargets.Count > 0) {
Debug.Log("Visto");
lastPlayerPosition = sightFov.visibleTargets[0];
agent.SetDestination(lastPlayerPosition.position);
}
//Persongaggio sparito
else {
//Il dottore si muove verso l'ultima posizione nota
Debug.Log("Perso");
agent.SetDestination(lastPlayerPosition.position);
//if(!isBackToPatrolCoroutine) StartCoroutine(BackToPatrol());
}
}
}
private IEnumerator FirstAlert() {
isFirstAlertCoroutine = true;
animator.SetBool("IsIdle", true);
animator.SetBool("IsWalking", false);
agent.autoBraking = true;
agent.isStopped = true;
alertMark.enabled = true;
sightFov.viewRadius = 8;
yield return new WaitForSeconds(2f);
animator.SetBool("IsIdle", false);
animator.SetBool("IsWalking", true);
agent.autoBraking = false;
agent.isStopped = false;
alertMark.enabled = false;
agent.speed = 3f;
sightFov.viewRadius = 10;
}
private IEnumerator BackToPatrol() {
isBackToPatrolCoroutine = true;
animator.SetBool("IsIdle", true);
animator.SetBool("IsWalking", false);
agent.autoBraking = true;
agent.isStopped = true;
yield return new WaitForSeconds(4f);
MakeTransition(DoctorStateTransition.NO_PLAYER_IN_SIGHT);
}
public override void OnCollisionEnter(Collision collision) {
//La collisione con il giocatore equivale alla morte
agent.autoBraking = true;
agent.isStopped = true;
animator.SetBool("IsIdle", true);
animator.SetBool("IsWalking", false);
this.gameObject.GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezeAll;
this.gameObject.GetComponent<DoctorFSM>().enabled = false;
collision.gameObject.GetComponentInParent<PlayerController>().currentHealth = 0;
}
public override void Exit() {
//All'uscita dallo stato di Pursue vengono ripristinati i valori originali
isFirstAlertCoroutine = false;
isBackToPatrolCoroutine = false;
animator.SetBool("IsIdle", false);
animator.SetBool("IsWalking", true);
//Reset dei parametri originali
agent.speed = 2f;
sightFov.viewRadius = 6;
StopAllCoroutines();
}
Comment
Answer by z3r07 · Dec 15, 2018 at 12:17 PM
Solved! My target is a child so I solved using agent.SetDestination(lastPlayerPosition.localPosition)
Your answer
![](https://koobas.hobune.stream/wayback/20220612184017im_/https://answers.unity.com/themes/thub/images/avi.jpg)