private void handleStateUpdate(MobStates newState) { if (newState == mobStateEnum) { return; } changeState(newState); }
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); } }
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; } }
public void Follow(Transform target) { State = MobStates.Follow; base.SetTarget(target); }
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; } }
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; } } }
public void StartWalking() { State = MobStates.Walking; StopAllCoroutines(); StartCoroutine(Walking()); }
void Update() { MobStates newState = mobState.OnUpdate(mobData); handleStateUpdate(newState); }