Hello I am having a problem with my code where the enemy unit that is farther from the friendly unit moves closers and then stops and does nothing. I am wondering what I did wrong can someone help?
using System;
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
public class EnemyAI : MonoBehaviour
{
private enum State
{
WaitingForEnemyTurn,
TakingTurn,
Busy,
}
private State state;
private float timer;
private void Awake()
{
state = State.WaitingForEnemyTurn;
}
private void Start()
{
TurnSystem.Instance.OnTurnChanged += TurnSystem_OnTurnChanged;
}
private void TurnSystem_OnTurnChanged(object sender, System.EventArgs e)
{
if (!TurnSystem.Instance.IsPlayerTurn())
{
state = State.TakingTurn;
timer = 2f;
}
}
private void Update()
{
if (TurnSystem.Instance.IsPlayerTurn()) return;
switch (state)
{
case State.WaitingForEnemyTurn:
break;
case State.TakingTurn:
timer -= Time.deltaTime;
if (timer <= 0f)
{
if (TryTakeEnemnyAIAction(SetStateTakingTurn))
{
state = State.Busy;
}
else
{
//No More enemies ahve actions they can take, end enemy turn.
TurnSystem.Instance.NextTurn();
}
}
break;
case State.Busy:
break;
}
}
private void SetStateTakingTurn()
{
timer = 0.5f;
state = State.TakingTurn;
}
private bool TryTakeEnemnyAIAction(Action onEnemyAIActionComplete)
{
foreach(Unit enemyUnit in UnitManager.Instance.GetEnemyUnitList())
{
if(TryTakeEnemnyAIAction(enemyUnit, onEnemyAIActionComplete))
{
Debug.Log(onEnemyAIActionComplete);
return true;
}
}
return false;
}
private bool TryTakeEnemnyAIAction(Unit enemyUnit, Action onEnemyAIActionComplete)
{
EnemyAIAction bestEnemyAIAction = null;
BaseAction bestBaseAction = null;
foreach(BaseAction baseAction in enemyUnit.GetBaseActionArray())
{
if (!enemyUnit.CanSpendActionPointsToTakeAction(baseAction))
{
// Enemy cannot afford this action
continue;
}
if(bestEnemyAIAction == null)
{
bestEnemyAIAction = baseAction.GetBestEnemyAIAction();
bestBaseAction = baseAction;
Debug.Log(baseAction);
}
else
{
EnemyAIAction testEnemyAIAction = baseAction.GetBestEnemyAIAction();
if(testEnemyAIAction != null && testEnemyAIAction.actionValue > bestEnemyAIAction.actionValue)
{
Debug.Log(baseAction);
bestEnemyAIAction = testEnemyAIAction;
bestBaseAction = baseAction;
}
}
}
if(bestEnemyAIAction != null && enemyUnit.TrySpendActionPointsToTakeAction(bestBaseAction))
{
bestBaseAction.TakeAction(bestEnemyAIAction.gridPosition, onEnemyAIActionComplete);
return true;
}
else
{
Debug.Log("test");
return false;
}
}
}