using UnityEngine;
using System.Collections.Generic;
using System.Linq;
public class AIController : MonoBehaviour
{
public Transform player;
public float activeDist;
public LayerMask targetMask;
public LayerMask obstacleMask;
private NavMeshAgent navMesh;
private List<Transform> visibleTargets = new List<Transform>();
private Transform target;
public EnemyState enemyState;
public enum EnemyState
{
IDLE,
MOVE,
ATTACK,
DIE
}
// Use this for initialization
void Start()
{
navMesh = GetComponent<NavMeshAgent>();
enemyState = EnemyState.IDLE;
}
// Update is called once per frame
void Update()
{
CheckTargetArea();
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()
{
navMesh.Stop();
}
private void ProcessMove()
{
if (player == null)
{
return;
}
navMesh.destination = player.position;
navMesh.Resume();
}
private void ProcessAttack()
{
}
private void ProcessDie()
{
}
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;
}
}
}
NO GAME NO DREAM !!!!