Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using Panda;
- public class Enemy : MonoBehaviour {
- // DISTANCE BETWEEN PLAYER & ENEMY
- float distance;
- // HEALTH & AMMO VALUES
- int health = 100;
- int ammo = 10;
- // OBJECTS
- public GameObject player;
- public GameObject gun;
- public GameObject projectile;
- public GameObject cover;
- // PATROL WPS
- public GameObject[] patrol;
- int current_patrol = 0;
- // CELEBRATION WPS
- public GameObject[] celeb;
- int current_celeb = 0;
- // WAYPOINT ACCURACY
- float accuracy = 0.3f;
- // MOVEMENT SPEEDS
- float patrol_speed = 3f;
- float chase_speed = 8f;
- float flee_speed = 8f;
- // PROJECTILE SPEED & DESPAWN TIMER
- float projecile_speed = 15f;
- float projecile_despawn = 3f;
- // EVERY FRAME, UPDATE DISTANCE BETWEEN PLAYER & ENEMY
- void Update() {
- distance = Vector3.Distance(player.transform.position, transform.position);
- }
- // BEHAVIOUR TRIGGERS
- [Task] bool patrolling() { if (!celebrating() && !low_on_health() && !out_of_ammo() && distance > 15) { return true; } return false; }
- [Task] bool chasing() { if (!celebrating() && !low_on_health() && !out_of_ammo() && distance > 8 && distance < 15) { return true; } return false; }
- [Task] bool shooting() { if (!celebrating() && !low_on_health() && !out_of_ammo() && distance < 8) { return true; } return false; }
- [Task] bool low_on_health() { if (!celebrating() && health < 30) { return true; } return false; }
- [Task] bool out_of_ammo() { if (!celebrating() && ammo < 1) { return true; } return false; }
- [Task] bool celebrating() { if (!player.activeSelf) { return true; } return false; }
- // MOVE MODE
- [Task] void move() {
- // CURRENT WAYPOINT
- GameObject waypoint = patrol[current_patrol];
- // CHECK DISTANCE BETWEEN OBJECT & WAYPOINT
- float distance = Vector3.Distance(waypoint.transform.position, transform.position);
- // IF DISTANCE IS LARGER THAN ACCURACY
- if (distance > accuracy) {
- // MOVE OBJECT TOWARDS WAYPOINT
- Vector3 foo = waypoint.transform.position - transform.position;
- transform.Translate(foo.normalized * (patrol_speed * Time.deltaTime), Space.World);
- // OTHERWISE
- } else {
- // INCREMENT THE INDEX
- current_patrol++;
- // IF INCREMENTED VALUE EXCEEDS LAST CHECKPOINT, SWAP IT TO THE FIRST
- if (current_patrol >= patrol.Length) { current_patrol = 0; }
- }
- Task.current.Succeed();
- }
- // CHASE MODE
- [Task] void chase() {
- // MOVE OBJECT TOWARDS WAYPOINT
- Vector3 foo = player.transform.position - transform.position;
- transform.Translate(foo.normalized * (chase_speed * Time.deltaTime), Space.World);
- Task.current.Succeed();
- }
- // TURN MODE
- [Task] void turn() {
- // TURN TOWARDS THE PLAYER & FINISH
- transform.LookAt(player.transform.position);
- Task.current.Succeed();
- }
- // SHOOT MODE
- [Task] void shoot() {
- // CREATE A PROJECTILE & MOVE IT TOWARD THE PLAYER
- GameObject proj = Instantiate(projectile, gun.transform.position, gun.transform.rotation);
- proj.GetComponent<Rigidbody>().velocity = proj.transform.forward * projecile_speed;
- // DESTROY IT AFTER X SECONDS
- Destroy(proj, projecile_despawn);
- // REMOVE ONE BULLET
- ammo -= 1;
- Task.current.Succeed();
- }
- // FLEE MODE
- [Task] void flee() {
- // CHECK DISTANCE BETWEEN OBJECT & WAYPOINT
- float distance = Vector3.Distance(cover.transform.position, transform.position);
- // IF DISTANCE IS LARGER THAN ACCURACY
- if (distance > accuracy) {
- // MOVE OBJECT TOWARDS WAYPOINT
- Vector3 foo = cover.transform.position - transform.position;
- transform.Translate(foo.normalized * (flee_speed * Time.deltaTime), Space.World);
- // OTHERWISE, FINISH THE TASK
- } else { Task.current.Succeed(); }
- }
- // RELOAD MODE
- [Task] void reload() {
- // RESET AMMO & FINISH
- ammo = 10;
- Task.current.Succeed();
- }
- // RECOVER MODE
- [Task] void recover() {
- // RESET HEALTH & FINISH
- health = 100;
- Task.current.Succeed();
- }
- // CELEBRATION MODE
- [Task] void celebrate() {
- // CURRENT WAYPOINT
- GameObject waypoint = celeb[current_celeb];
- // CHECK DISTANCE BETWEEN OBJECT & WAYPOINT
- float distance = Vector3.Distance(waypoint.transform.position, transform.position);
- // IF DISTANCE IS LARGER THAN ACCURACY
- if (distance > accuracy) {
- // MOVE OBJECT TOWARDS WAYPOINT
- Vector3 foo = waypoint.transform.position - transform.position;
- transform.Translate(foo.normalized * (patrol_speed * Time.deltaTime), Space.World);
- // OTHERWISE
- } else {
- // INCREMENT THE INDEX
- current_celeb++;
- // IF INCREMENTED VALUE EXCEEDS LAST CHECKPOINT, SWAP IT TO THE FIRST
- if (current_celeb >= celeb.Length) { current_celeb = 0; }
- }
- Task.current.Succeed();
- }
- // ON PROJECTILE IMPACT
- private void OnTriggerEnter(Collider other) {
- // REMOVE 10 HEALTH & DESTROY THE PROJECTILE
- health -= 10;
- Destroy(other.gameObject);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement