top of page
Search

First Person Enemy

  • Writer: Keshav Batra
    Keshav Batra
  • Feb 26, 2021
  • 2 min read

Updated: Mar 2, 2021

I finally got a functioning enemy and I plan on adding more because I want this to be like an actual fps in space. Below is the code that makes the enemy move:



public class EnemyController : MonoBehaviour

{

public NavMeshAgent agent;


public Transform player;


public LayerMask whatIsGround, whatIsPlayer;


public float health;



//Patrolling

public Vector3 walkPoint;

bool walkPointSet;

public float walkPointRange;


//Attacking

public float timeBetweenAttacks;

bool alreadyAttacked;

public GameObject projectile;


//States

public float sightRange, attackRange;

public bool playerInSightRange, playerInAttackRange;


private void Awake()

{

player = GameObject.Find("Player").transform;

agent = GetComponent<NavMeshAgent>();

}


private void Update()

{

//Check for sight and attack rang

playerInSightRange = Physics.CheckSphere(transform.position, sightRange, whatIsPlayer);

playerInAttackRange = Physics.CheckSphere(transform.position, attackRange, whatIsPlayer);


if (!playerInSightRange && !playerInAttackRange) Patroling();

if (playerInSightRange && !playerInAttackRange) ChasePlayer();

if (playerInAttackRange && !playerInSightRange) AttackPlayer();

}


private void Patroling()

{

Debug.Log("Patrolling");

if (!walkPointSet) SearchWalkPoint();


if (walkPointSet)

agent.SetDestination(walkPoint);


Vector3 distanceToWalkPoint = transform.position - walkPoint;


//Walkpoint reached

if (distanceToWalkPoint.magnitude < 1f)

walkPointSet = false;

}

private void SearchWalkPoint()

{

Debug.Log("SearchWalkPoint");


//Calculate random point in range

float randomZ = Random.Range(-walkPointRange, walkPointRange);

float randomX = Random.Range(-walkPointRange, walkPointRange);


walkPoint = new Vector3(transform.position.x + randomX, transform.position.y, transform.position.z + randomZ);


if (Physics.Raycast(walkPoint, -transform.up, 2f, whatIsGround))

walkPointSet = true;

}

private void ChasePlayer()

{

Debug.Log("ChasePlayer");


agent.SetDestination(player.position);

}

private void AttackPlayer()

{

//Make sure enemy doesn't move

agent.SetDestination(transform.position);


transform.LookAt(player);


if (!alreadyAttacked)

{

///Attack code here

Rigidbody rb = Instantiate(projectile, transform.position, Quaternion.identity).GetComponent<Rigidbody>();

rb.AddForce(transform.forward * 32f, ForceMode.Impulse);

rb.AddForce(transform.up * 8f, ForceMode.Impulse);




///

alreadyAttacked = true;

Invoke(nameof(ResetAttack), timeBetweenAttacks);


}

}


private void ResetAttack()

{

alreadyAttacked = false;

}


public void TakeDamage(int damage)

{

health -= damage;

if (health <= 0) Invoke(nameof(DestroyEnemy), .5f);

}

private void DestroyEnemy()

{

Destroy(gameObject);

}


private void OnDrawGizmosSelected()

{

Gizmos.color = Color.red;

Gizmos.DrawWireSphere(transform.position, attackRange);

Gizmos.color = Color.yellow;

Gizmos.DrawWireSphere(transform.position, sightRange);

}

private void OnTriggerEnter(Collider other)

{

if (other.gameObject.GetComponent<Player>())

{

other.gameObject.GetComponent<Player>().TakeDamage(10);

}

}

}



 
 
 

Comments


bottom of page