Amir228
@Amir228

Почему враг меняет свои состояния?

Использую паттерн 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;
}
  • Вопрос задан
  • 83 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы