Ai | FEP
Wed May 04 2022 17:44:34 GMT+0000 (Coordinated Universal Time)
Saved by @BiscuitTinx #c#
using UnityEngine; using UnityEngine.AI; public class AI : MonoBehaviour { public NavMeshAgent agent; public Transform player; public LayerMask whatIsGround, whatIsPlayer; // patrolling public Vector3 walkPoint; bool walkPointSet; public float walkPointRange; // attacking public float timeBetweenAttacks; bool alreadyAttacked; public GameObject projectile; public Transform bulletSpawn; // 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(); } } 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 doesnt move agent.SetDestination(transform.position); transform.LookAt(player); if (!alreadyAttacked) { /// attack code here Rigidbody rb = Instantiate(projectile, bulletSpawn.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; } private void OnDrawGizmosSelected() { Gizmos.color = Color.red; Gizmos.DrawWireSphere(transform.position, attackRange); Gizmos.color = Color.yellow; Gizmos.DrawWireSphere(transform.position, sightRange); } }
Comments