Использую паттерн Finite State Mashine для создании врага. Есть три состояние: IdleState, ComeState, AtackState.
Idle это состояние когда враг не видит игрока и просто стоит ждет его. AtackState состояние когда враг заметил игрока и идет к нему чтобы атаковать. Come это когда враг потерял изведу игрока и бежит на позицию где видел игрока(игрок допустим спрятался).
Каждое состояние наследует State, в этом классе есть метод Update(обновление состояние). Я покажу лишь как раз метод Update этих трех состояний(чтобы чересчур много кода не было).
IdleState:
protected override void Update()
{
if (visibility.detected == Visibility.Detected.Enemy)
{
sm.SetState<SoldierGunAtackState>();
}
}
ComeState:
protected override void Update()
{
if (Distance(npsTran.position, (Vector2)comePos) <= 1f)//А тут если он дошел до нужной позиции то состояние меняеться
{
nps.ComeActive = false;
sm.SetState<SoldierIdleState>();
}
else
{
MoveAndLookNavMesh(agent, (Vector2)comePos);//тут враг просто идет куда надо
}
if (visibility.detected == Detected.Unit)
sm.SetState<SoldierIdleState>();
}
AtackState:
protected override void Update()
{
if (visibility.detected != Visibility.Detected.Enemy)
sm.SetState<SoldierComeState>();
}
Есть скрипт Visibility, там просто код который проверяет видит ли враг игрока. Выгледит он примерно так:
Visibility:
public enum Detected { Null, Enemy }
public Detected detected { get; private set; }
void Update
{
detected = Detected.Null;
if (EnemyVisible) detected = Detected.Enemy;
}