using UnityEngine;
using System.Collections.Generic;
using System.Linq;
public class AIController : MonoBehaviour
{
public Transform player;
public LayerMask targetMask;
public LayerMask obstacleMask;
public float activeDist;
public float attackRange = 1;
public int maxHealth = 100;
private NavMeshAgent navMesh;
private List<Transform> visibleTargets = new List<Transform>();
private Transform target;
public EnemyState enemyState;
private int currentHealth;
public enum EnemyState
{
IDLE,
MOVE,
ATTACK,
DIE
}
void Start()
{
navMesh = GetComponent<NavMeshAgent>();
enemyState = EnemyState.IDLE;
currentHealth = maxHealth;
}
void Update()
{
if (currentHealth <= 0)
{
currentHealth = 0;
enemyState = EnemyState.DIE;
}
CheckState();
}
private void CheckState()
{
switch (enemyState)
{
case EnemyState.IDLE:
ProcessIdle();
break;
case EnemyState.MOVE:
ProcessMove();
break;
case EnemyState.ATTACK:
ProcessAttack();
break;
case EnemyState.DIE:
ProcessDie();
break;
}
}
private void ProcessIdle()
{
CheckTargetArea();
navMesh.Stop();
}
private void ProcessMove()
{
if (player == null)
{
return;
}
float dist = Vector3.Distance(player.position, transform.position);
if (dist < attackRange)
{
enemyState = EnemyState.ATTACK;
return;
}
navMesh.destination = player.position;
navMesh.Resume();
}
private void ProcessAttack()
{
float dist = Vector3.Distance(player.position, transform.position);
if (dist >= attackRange)
{
enemyState = EnemyState.MOVE;
return;
}
// attack
Debug.Log("Attack");
}
private void ProcessDie()
{
// player ie animation
Destroy(gameObject);
}
private void CheckTargetArea()
{
visibleTargets.Clear();
Collider[] colliders = Physics.OverlapSphere(transform.position, activeDist, targetMask);
for (int i = 0; i < colliders.Length; i++)
{
Transform targetArea = colliders[i].transform;
Vector3 dirToTarget = (targetArea.position - transform.position).normalized;
if (Vector3.Angle(transform.forward, dirToTarget) < (360*0.5f))
{
float distToTarget = Vector3.Distance(transform.position, targetArea.position);
if (!Physics.Raycast(transform.position, dirToTarget, distToTarget, obstacleMask))
{
visibleTargets.Add(targetArea);
}
}
}
if (visibleTargets.Count > 0)
{
target = visibleTargets.First();
enemyState = EnemyState.MOVE;
}
else
{
enemyState = EnemyState.IDLE;
}
}
void OnTriggerEnter(Collider hit)
{
if (hit.CompareTag("Bullet"))
{
currentHealth -= 25;
}
}
}
ปล. มีอะไรแนะนำได้นะครับ
NO GAME NO DREAM !!!!