[go: up one dir, main page]

0% found this document useful (0 votes)
54 views3 pages

Enemy Ai Tutorial

This document contains a script for an enemy AI in Unity. The script handles patrolling, chasing the player, attacking the player, and taking damage. It uses NavMeshAgent to navigate and physics checks to detect sight and attack ranges.

Uploaded by

David Parra
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
54 views3 pages

Enemy Ai Tutorial

This document contains a script for an enemy AI in Unity. The script handles patrolling, chasing the player, attacking the player, and taking damage. It uses NavMeshAgent to navigate and physics checks to detect sight and attack ranges.

Uploaded by

David Parra
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 3

using UnityEngine;

using UnityEngine.AI;

public class EnemyAiTutorial : MonoBehaviour


{
public NavMeshAgent agent;

public Transform player;

public LayerMask whatIsGround, whatIsPlayer;

public float health;

//Patroling
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("PlayerObj").transform;
agent = GetComponent<NavMeshAgent>();
}

private void Update()


{
//Check for sight and attack range
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()


{
if (!walkPointSet) SearchWalkPoint();

if (walkPointSet)
agent.SetDestination(walkPoint);

Vector3 distanceToWalkPoint = transform.position - walkPoint;

//Walkpoint reached
if (distanceToWalkPoint.magnitude < 1f)
walkPointSet = false;
}
private void 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()


{
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);
///End of attack code

alreadyAttacked = true;
Invoke(nameof(ResetAttack), timeBetweenAttacks);
}
}
private void ResetAttack()
{
alreadyAttacked = false;
}

public void TakeDamage(int damage)


{
health -= damage;

if (health <= 0) Invoke(nameof(DestroyEnemy), 0.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);
}
}

You might also like