@PyChan

Почему не кэшируются переменные?

Делаю что-то вроде стейт машины. Вот один из стейтов (состояние преследования игрока):

public class EnemyPursuingState : StateBase
{
    [SerializeField] private float speed = 6.0f;

    private NavMeshAgent agent;

    private Transform aim;
    
    protected override void Init()
    {
        agent = GetComponentInParent<NavMeshAgent>();
        Debug.Log(agent);
        agent.speed = speed;
    }

    public override IEnumerator Action()
    {
        Debug.Log(agent);
        Vector3 aimPos = CharacterControl.Instance.playerTransform.position;
        float distToAim = Vector3.SqrMagnitude(aimPos - transform.position);
        while (true)
        {
            agent.SetDestination(aimPos);
            yield return new WaitForFixedUpdate();
        }

    }
}

Скрипт, переключающий состояния:
public class StateHandler : MonoBehaviour
{
    [SerializeField] private float detectionRadius;
    [SerializeField] private float attackRadius;

    [SerializeField] private StateBase idleState;
    [SerializeField] private StateBase persecutionState;
    [SerializeField] private StateBase attackState;
    [SerializeField] private StateBase deadState;

    private enum States
    {
        IDLE,
        PERSECUTION,
        ATTACK,
        DEAD
    }

    private States currentState;

    private StateBase[] states;
    private Transform aim;

    private void Start()
    {
        aim = CharacterControl.Instance.playerTransform;
        states = GetComponentsInChildren<StateBase>();
        currentState = States.IDLE;
        StartCoroutine(idleState.Action());
    }
    private void Update()
    {
        float distanceToAim = CountMagnitude();
        if (distanceToAim < detectionRadius & distanceToAim > attackRadius & currentState != States.PERSECUTION)
        {
            SwitchToState(persecutionState);
            currentState = States.PERSECUTION;
        }
        else if (distanceToAim <= attackRadius & currentState != States.ATTACK)
        {
            SwitchToState(attackState);
            currentState = States.ATTACK;
        }
        else if (currentState != States.IDLE)
        {
            currentState = States.IDLE;
            SwitchToState(idleState);
        }
    }

    private float CountMagnitude()
    {
        return Vector3.SqrMagnitude(aim.position - transform.position);
    }

    public void SwitchToState(IState nextState)
    {
        foreach (var state in states)
            state.StopAllCoroutines();
        StartCoroutine(nextState.Action());
    }

}

Проблема в том, что при старте полю agent в скрипте преследования присваивается значение, однако при запуске корутины Action это поле почему-то равно null. Я не могу понять, где это переопределение происходит. Помогите, пожалуйста
  • Вопрос задан
  • 40 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы