示例#1
0
    protected override bool OnCheck()
    {
        Cannibal can = target.value.GetComponentInParent <Cannibal>();

        if (can != null && can.IsDead())
        {
            return(true);
        }
        else
        {
            return(false);
        }
    }
示例#2
0
 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);
     }
 }
示例#3
0
        // 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;
            }
        }