Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using UnityEngine;
- using System.Collections;
- public class EnemyMovement : MonoBehaviour
- {
- [Range(0, 360)]
- public float enemyFOV = 120f;
- [Range(5, 30)]
- public float detectionRange = 15f;
- private float deadZone = 5f;
- private NavMeshAgent nav;
- private GameObject player;
- private Animator anim;
- private HashIDs hash;
- private SphereCollider sCollider;
- private EnemyAnimatorHelper animatorHelper;
- private Health health;
- private bool playerInFOV;
- private bool playerInHearRange;
- private CapsuleCollider cCollider;
- private Vector3 lastKnownPosition;
- private float speed;
- private float angle;
- private bool enemyAnimIsDead;
- private float timer = 0.0f;
- private AudioSource footStepSound;
- void Awake()
- {
- nav = GetComponent<NavMeshAgent>();
- anim = GetComponent<Animator>();
- sCollider = GetComponent<SphereCollider>();
- health = GetComponent<Health>();
- cCollider = GetComponent<CapsuleCollider>();
- player = GameObject.FindGameObjectWithTag(Tags.player);
- hash = GameObject.FindGameObjectWithTag(Tags.gameController).GetComponent<HashIDs>();
- animatorHelper = new EnemyAnimatorHelper(anim, hash);
- nav.updateRotation = false;
- deadZone *= Mathf.Deg2Rad;
- anim.SetLayerWeight(1, 1f);
- lastKnownPosition = transform.position;
- playerInFOV = false;
- playerInHearRange = false;
- speed = 0f;
- angle = 0f;
- sCollider.radius = detectionRange;
- footStepSound = GetComponent<AudioSource>();
- enemyAnimIsDead = true;
- }
- void OnAnimatorMove()
- {
- nav.velocity = anim.deltaPosition / Time.deltaTime;
- transform.rotation = anim.rootRotation;
- }
- void Update()
- {
- if (health.currentHealth > 0)
- {
- DetectionManager();
- DecisionManager();
- Debug.DrawLine(lastKnownPosition, lastKnownPosition + Vector3.up * 4, Color.blue);
- if (playerInFOV)
- Debug.DrawLine(lastKnownPosition, lastKnownPosition + new Vector3(1, 2, 0), Color.red);
- if (playerInHearRange)
- Debug.DrawLine(lastKnownPosition, lastKnownPosition + new Vector3(-11, 2, 0), Color.green);
- }
- else
- {
- DeathAnimation();
- timer += Time.deltaTime;
- {
- if (timer > 5.0f)
- Destroy(this.gameObject);
- }
- }
- }
- void OnTriggerStay(Collider other)
- {
- if (other.gameObject == player)
- {
- lastKnownPosition = player.transform.position;
- playerInHearRange = true;
- Debug.DrawLine(transform.position + Vector3.up, lastKnownPosition + Vector3.up, Color.green);
- }
- }
- void OnTriggerExit(Collider other)
- {
- if (other.gameObject == player)
- {
- lastKnownPosition = player.transform.position;
- playerInFOV = false;
- playerInHearRange = false;
- }
- }
- void DetectionManager()
- {
- DetectionManager(lastKnownPosition);
- }
- void DetectionManager(Vector3 position)
- {
- if (Vector3.Distance(transform.position, position) < sCollider.radius)
- {
- Vector3 direction = position - transform.position;
- float signAngle = Vector3.Angle(direction, transform.forward);
- if (signAngle < enemyFOV * 0.5f)
- {
- RaycastHit hit;
- if (Physics.Raycast(transform.position + transform.up, direction.normalized, out hit, sCollider.radius))
- {
- if (hit.collider.gameObject == player)
- {
- Debug.DrawLine(transform.position + Vector3.up, position + Vector3.up, Color.red);
- playerInFOV = true;
- }
- else
- {
- playerInFOV = false;
- }
- }
- }
- }
- }
- void DecisionManager()
- {
- angle = FindAngle(transform.forward, lastKnownPosition - transform.position, transform.up);
- if(Vector3.Distance(lastKnownPosition, transform.position) < 1.5f)
- {
- if (playerInHearRange)
- {
- MovementManager(0, angle);
- }
- MovementManager(0, 0);
- return;
- }
- else
- {
- if(playerInHearRange)
- {
- //turn in sound direction
- speed = 1f;
- }
- if (playerInFOV)
- {
- //attack
- speed = 4f;
- }
- MovementManager(speed, angle);
- return;
- }
- }
- void MovementManager(float speed = 0, float angle = 0)
- {
- if(Mathf.Abs(angle)< deadZone)
- {
- transform.LookAt(transform.position + nav.desiredVelocity);
- angle = 0;
- }
- animatorHelper.Setup(speed, angle);
- }
- private void DeathAnimation()
- {
- if (enemyAnimIsDead)
- {
- anim.SetTrigger(hash.isDead);
- cCollider.isTrigger = true;
- enemyAnimIsDead = false;
- }
- }
- float FindAngle(Vector3 fromVector, Vector3 toVector, Vector3 upVector)
- {
- if (toVector == Vector3.zero)
- return 0f;
- float angle = Vector3.Angle(fromVector, toVector);
- Vector3 normal = Vector3.Cross(fromVector, toVector);
- angle *= Mathf.Sign(Vector3.Dot(normal, upVector));
- angle *= Mathf.Deg2Rad;
- return angle;
- }
- void FootSteps()
- {
- footStepSound.pitch = UnityEngine.Random.Range(0.9f, 1.1f);
- footStepSound.PlayOneShot(footStepSound.clip);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement