Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using UnityEngine;
- using System.Collections;
- public class EnemyMovement : MonoBehaviour
- {
- public float movSpeed, rotSpeed;
- public Transform[] waypoints;
- public int curWaypoint, nextWaypoint;
- Quaternion targetRotation;
- public float y;
- bool choosing, goingStraight;
- public float curveSpeed, curve;
- public float attackRange;
- public float chaseRange;
- Vector3 targetPosition, playerPosition;
- PlayerHealth player;
- NavMeshAgent agent;
- Animator anim;
- public enum EnemyState { idle, patroling, chasing, attacking, escaping, dying };
- public EnemyState eState= 0;
- public int animVariable = 0;
- public float fieldOfView = 90;
- void Start() {
- animVariable = 0;
- player = FindObjectOfType<PlayerHealth>();
- // goingStraight = true;
- /* transform.position = waypoints[0].position + Vector3.up * y;
- StartCoroutine(Turning());
- StartCoroutine(CheckPlayerPosition());*/
- agent = GetComponent<NavMeshAgent>();
- anim = GetComponent<Animator>();
- eState = EnemyState.idle;
- }
- void Update()
- {
- Sight(transform, player.transform,fieldOfView, "Player");
- SetAnimVariable();
- switch (eState)
- {
- case EnemyState.idle:
- Idling();
- break;
- case EnemyState.patroling:
- Patroling();
- break;
- case EnemyState.chasing:
- Chasing();
- break;
- case EnemyState.attacking:
- Attacking();
- break;
- case EnemyState.escaping:
- break;
- case EnemyState.dying:
- break;
- default:
- break;
- }
- }
- void SetAnimVariable() {
- switch (eState) {
- case EnemyState.idle:
- animVariable = 0;
- break;
- case EnemyState.chasing:
- lol();
- break;
- case EnemyState.attacking:
- animVariable = 2;
- break;
- default:
- break;
- }
- }
- void lol() {
- animVariable = 1;
- }
- void Idling()
- {
- //animVariable = 0;
- /* transform.position += transform.forward * movSpeed * Time.deltaTime;
- transform.Rotate(0, curve, 0);
- //if (goingStraight)
- curve = (Mathf.PingPong(Time.time, curveSpeed) - curveSpeed / 2);*/
- }
- void Patroling()
- {
- targetPosition = waypoints[nextWaypoint].position;
- transform.position = Vector3.MoveTowards(transform.position, targetPosition + Vector3.up * y, movSpeed * Time.deltaTime);
- targetRotation = Quaternion.LookRotation(targetPosition + Vector3.up * y - transform.position);
- transform.eulerAngles = Vector3.up * Mathf.MoveTowardsAngle(transform.eulerAngles.y, targetRotation.eulerAngles.y, rotSpeed * Time.deltaTime);
- if ((targetPosition + Vector3.up * y - transform.position).magnitude < 1f)
- {
- StartCoroutine(ChooseNextWaypoint());
- }
- }
- void Chasing(){
- // animVariable = 1;
- LookAtPlayer();
- if (attackRange > PlayerEnemyDistance) {
- eState = EnemyState.attacking;
- }
- else if(PlayerEnemyDistance > chaseRange) {
- eState = EnemyState.idle;
- }
- /* targetPosition = playerPosition;
- transform.position = Vector3.MoveTowards(transform.position, targetPosition + Vector3.up * y, movSpeed * Time.deltaTime);
- targetRotation = Quaternion.LookRotation(targetPosition + Vector3.up * y - transform.position);
- transform.eulerAngles = Vector3.up * Mathf.MoveTowardsAngle(transform.eulerAngles.y, targetRotation.eulerAngles.y, rotSpeed * Time.deltaTime);
- if ((targetPosition + Vector3.up * y - transform.position).magnitude < 1f)
- {
- StartCoroutine(ChooseNextWaypoint());
- }*/
- }
- void Attacking()
- {
- // animVariable = 2;
- agent.Stop();
- if (PlayerEnemyDistance > attackRange)
- eState = EnemyState.chasing;
- }
- IEnumerator ChooseNextWaypoint()
- {
- if (!choosing)
- {
- choosing = true;
- yield return new WaitForSeconds(1f);
- nextWaypoint++;
- if (nextWaypoint == waypoints.Length) nextWaypoint = 0;
- choosing = false;
- StopCoroutine(ChooseNextWaypoint());
- }
- }
- IEnumerator Turning()
- {
- while (eState == EnemyState.idle)
- {
- float orCurve = curve;
- goingStraight = false;
- curve = (Random.Range(0, 6) > 3) ? 3f : -3f;
- yield return new WaitForSeconds(Random.Range(.1f, 1f));
- curve = orCurve;
- yield return new WaitForSeconds(Random.Range(1f, 5f));
- goingStraight = true;
- }
- }
- IEnumerator CheckPlayerPosition()
- {
- if (eState == EnemyState.chasing)
- {
- // playerPosition = player.transform.position;
- yield return new WaitForSeconds(2f);
- }
- }
- void Sight(Transform me, Transform target, float angleRange, string targetTag) {
- Vector3 direction = target.position - me.position;
- float angle = Mathf.Atan2(direction.z, direction.x) * Mathf.Rad2Deg;
- if (IsTargerWithinAngleRange(me, angle, angleRange)) {
- Ray ray = new Ray(me.GetChild(0).position, direction);
- RaycastHit hit;
- if (Physics.Raycast(ray, out hit)) {
- if (hit.collider.gameObject.tag == "Player") {
- eState = EnemyState.chasing;
- }
- }
- }
- }
- void LookAtPlayer() {
- Vector3 v = player.transform.position - transform.position;
- float angle = -Mathf.Rad2Deg * Mathf.Atan2(v.z, v.x);
- transform.eulerAngles = new Vector3(0, angle, 0);
- }
- float PlayerEnemyDistance {
- get {
- return Vector3.Magnitude(player.transform.position - transform.position);
- }
- }
- bool IsTargerWithinAngleRange(Transform me, float angle, float angleField) {
- return SomeFunctions.Is_C_Between_A_and_B(angle, -me.eulerAngles.y - angleField / 2, -me.eulerAngles.y + angleField / 2);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement