protected override bool OnCheck() { Cannibal can = target.value.GetComponentInParent <Cannibal>(); if (can != null && can.IsDead()) { return(true); } else { return(false); } }
public void EndShoot() { if (CurrentTask.id == (int)ChasseurTask.Shoot) { Cannibal cannibal = CurrentTask.target.GetComponentInParent <Cannibal>(); GameObject target = CurrentTask.target; tasks.Pop(); if (cannibal != null) { if (cannibal.IsDead()) { tasks.Push(new Task((int)ChasseurTask.Defend, target)); } else { tasks.Push(new Task((int)ChasseurTask.Chase, target)); } } Debug.Log("EndShoot:" + CurrentTask.id); } }
// Update is called once per frame new void Update() { base.Update(); if (animator != null && agent != null) { animator.SetFloat(anim_speedId, agent.velocity.magnitude); } else { Debug.Log("Chasseur.cs: animator ou navmeshagent non présent"); } if (los.Updated) { //Analyse de la vue du chasseur foreach (GameObject obj in los.sighted) { Cannibal cannibal = obj.GetComponentInParent <Cannibal>(); if (cannibal != null && !cannibal.IsDead()) { if (CurrentTask.id == (int)ChasseurTask.Normal) { agent.ResetPath(); tasks.Push(new Task((int)ChasseurTask.Look, obj)); } else if (CurrentTask.id == (int)ChasseurTask.LostTarget && obj != CurrentTask.target) //Change de cible { agent.ResetPath(); tasks.Pop(); CurrentTask.target = obj; } } } } Vector3 targetPosition; //Manage tasks switch (CurrentTask.id) { case (int)ChasseurTask.Normal: //Follow waypoints if (patrouille != null) { if (CurrentTask.elapsed > 4 && MoveTo(patrouille.getCurrentDestination(), 5)) { patrouille.Next(); CurrentTask.elapsed = 0; } } break; //Poursuis le joueur repéré case (int)ChasseurTask.Chase: if (MoveTo(CurrentTask.target.transform.position, shootingRange)) { agent.ResetPath(); GameObject target = CurrentTask.target; tasks.Pop(); tasks.Push(new Task((int)ChasseurTask.Shoot, target)); } else if ((CurrentTask.target.transform.position - transform.position).sqrMagnitude >= Mathf.Pow((los.camera.farClipPlane), 2)) { agent.ResetPath(); tasks.Push(new Task((int)ChasseurTask.LostTarget, CurrentTask.target)); } break; //Regarde vers le joueur jusqu'à détection case (int)ChasseurTask.Look: targetPosition = agent.transform.position; targetPosition.y = agent.transform.position.y; agent.transform.LookAt(targetPosition); //Si le joueur est en vue if (los.sighted.Contains(CurrentTask.target)) { //Si le joueur est détecté -> poursuite if ((CurrentTask.target.transform.position - transform.position).sqrMagnitude < Mathf.Pow((CurrentTask.elapsed / detectTime) * (los.camera.farClipPlane), 2)) { GameObject target = CurrentTask.target; tasks.Pop(); tasks.Push(new Task((int)ChasseurTask.Chase, target)); } } else //Si le joueur n'est plus en vue, on diminue le timer { CurrentTask.elapsed -= Time.deltaTime * 2; //Si le temps est négatif, on abandonne if (CurrentTask.elapsed < 0) { tasks.Pop(); } } break; //Le chasseur a perdu sa cible de vue case (int)ChasseurTask.LostTarget: //Si il la voit à nouveau, retourne dans Chase if (los.sighted.Contains(CurrentTask.target)) { tasks.Pop(); } else { //Après un certain temps, retourne à l'état précédent le chase if (CurrentTask.elapsed > lostTargetTime) { tasks.Pop(); tasks.Pop(); } else //Sinon se déplace vers l'objet { MoveTo(CurrentTask.target.transform.position, shootingRange); } } break; case (int)ChasseurTask.Shoot: if (CurrentTask.count == 0) { animator.Play(anim_shoot); CurrentTask.count++; } targetPosition = CurrentTask.target.transform.position; targetPosition.y = agent.transform.position.y; agent.transform.LookAt(targetPosition); if (CurrentTask.elapsed > 7) { tasks.Pop(); } break; //Attends à coté du cadavre du cannibal case (int)ChasseurTask.Defend: WanderAround(CurrentTask.target.transform.position, 5); if (CurrentTask.elapsed > defendTime) { agent.ResetPath(); tasks.Pop(); } break; } }