Делаю что-то вроде стейт машины. Вот один из стейтов (состояние преследования игрока):
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. Я не могу понять, где это переопределение происходит. Помогите, пожалуйста