예제 #1
0
    private void handleStateUpdate(MobStates newState)
    {
        if (newState == mobStateEnum)
        {
            return;
        }

        changeState(newState);
    }
예제 #2
0
 public void Death(Stats stats)
 {
     if(State != MobStates.Death)
     {
         Status = MobStatus.None;
         State = MobStates.Death;
         Stop();
         PlayerControll.Instance.Stats.Energy += stats.Energy;
         Agent.enabled = false;
         GetComponent<SphereCollider>().enabled = false;
         Animator.SetTrigger("Death");
         Harmable.AllHarmableObjects.Remove(this);
         Destroy(gameObject, 5);
     }
 }
예제 #3
0
    private void changeState(MobStates newState)
    {
        mobStateEnum = newState;
        switch (newState)
        {
        case MobStates.Patrol:
            this.mobState = new MobPatrolingState(transform, this.getWaypoints(), speed, mobData);
            break;

        case MobStates.Follow:
            this.mobState = new MobFollowingState(mobData, transform, audioS, clips);
            break;

        default:
            break;
        }
    }
예제 #4
0
 public void Follow(Transform target)
 {
     State = MobStates.Follow;
     base.SetTarget(target);
 }
예제 #5
0
 IEnumerator Walking()
 {
     Agent.Resume();
     Vector3 someTargetPosition = AreaSpawn.GetSomePosition();
     SetTarget(someTargetPosition);
     while (Agent.pathPending)
     {
         yield return 0;
     }
     switch (Agent.pathStatus)
     {
         case NavMeshPathStatus.PathPartial:
             Stop();
             State = MobStates.None;
             break;
         case NavMeshPathStatus.PathComplete:
             float timeWaiting = Random.Range(2, 5);
     //TODO: если точку не получается достигнуть спустя какое-то время, то идти в другое место
             while (Agent.remainingDistance > 0.5)
             {
                 yield return 0;
             }
             yield return new WaitForSeconds(timeWaiting);
             StartCoroutine(Walking());
             break;
     }
 }
예제 #6
0
 public override void Update()
 {
     base.Update();
     if (Agent.enabled)
     {
         switch (Status)
         {
             case MobStatus.Guard:
                 if (State == MobStates.None && AreaSpawn != null)
                 {
                     StartWalking();
                     break;
                 }
                 if (Sensor != null && State != MobStates.Follow)
                 {
                     if (Vector3.Dot(transform.forward, (PlayerControll.Instance.transform.position - transform.position).normalized) > Sensor.AngleReaction && Vector3.Distance(transform.position, PlayerControll.Instance.transform.position) < Sensor.DistanceReaction)
                     {
                         NavMeshHit hit;
                         if (!Agent.Raycast(PlayerControll.Instance.transform.position, out hit))
                         {
                             Sensor.Detected(this, PlayerControll.Instance.transform);
                             break;
                         }
                     }
                 }
                 if (State == MobStates.Follow && Sensor != null)
                 {
                     if (Vector3.Distance(transform.position, PlayerControll.Instance.transform.position) > Sensor.DistanceReaction)
                     {
                         Stop();
                         State = MobStates.None;
                     }
                 }
                 break;
             case MobStatus.Ranger:
                 if (State != MobStates.Follow)
                 {
                     SetTarget(PlayerControll.Instance.transform);
                     State = MobStates.Follow;
                 }
                 break;
         }
     }
 }
예제 #7
0
 public void StartWalking()
 {
     State = MobStates.Walking;
     StopAllCoroutines();
     StartCoroutine(Walking());
 }
예제 #8
0
    void Update()
    {
        MobStates newState = mobState.OnUpdate(mobData);

        handleStateUpdate(newState);
    }