FSM state change delay

I am in the early stages of creating my own AI and so far, everything works as I had hoped EXCEPT changing a specific state: there is delay between “charge” and “attack” that I have no idea why. For a bout a second after it should switch, it just runs in place. Anyway, here is my code which will explain the states:

edit: not a delay. It goes back to the “Charge” state for some reason. It goes to “Attack” then back to “Charge”. Anyone have an idea why?
Thanks!

public var NMA : NavMeshAgent;
public var dest : Vector3;
public var distanceToPlayer : float=100;
public var player : Transform;
public var PH : Health;
public var damageAmount : float = 5;
public var forceAmount : float = 5;
private var tr : Transform;
private var isDead : boolean = false;
var intimidateDistace = 10.0;
var attackDistance = 3.0;
var noticeDistance = 15.0;
var curState : enemyState;
var Damping = 6.0;
var waiting = false;
var IntimidateTime=1.5;
var AttackTime=0.0;
var attackRepeatTime = 1;
var TurnTime=1.5;
var angle = 1.1;
private var CA : int;
var IdleA : AnimationClip[];
var TurnA : AnimationClip[];
var WalkA : AnimationClip;
var RunA : AnimationClip;
var IntimidateA : AnimationClip[];
var AttackA : AnimationClip[];
var anim : Animation;
public enum enemyState { start, idle, alert, patrol, find, intimidate, charge, attack, hit, dead, stop}
function Start () {
    curState = enemyState.start;
    tr = transform;
    NMA=GetComponent.<NavMeshAgent>();
    anim=GetComponent.<Animation>();
  
}

function Update () {
    if(player==null)
    {
        player=GameObject.FindGameObjectWithTag("Player").transform;
        PH=player.GetComponent.<Health>();
        curState=enemyState.idle;
        if(player!=null)
        {
            var iI = Random.Range(0,IdleA.Length);
            anim.CrossFade(IdleA[iI].name);
        }
        return;
    }
    distanceToPlayer=Vector3.Distance(player.position,tr.position);
  

  
  
    switch (curState) {
            case enemyState.start:
              
                break;
              
            case enemyState.idle:
                Idle();
                break;
              
            case enemyState.patrol:
              
                break;
              
            case enemyState.alert:
              
                Alert();
              
                break;
              
            case enemyState.find:
                Find();
                break;
              
            case enemyState.intimidate:
                Intimidate();
              
                break;
                              
            case enemyState.charge:
                Charge();
                break;
                  
            case enemyState.attack:
                Attack();
                break;  
              
            case enemyState.hit:
                Hit();
                break;  
              
            case enemyState.dead:
                Dead();
                break;  
              
            case enemyState.stop:
                Stop();
                break;
                }
}
function Idle()
{
    NMA.Stop();
    if(distanceToPlayer<noticeDistance)
    {
        curState=enemyState.alert;
    }
}
function Alert()
{
    var rot = Quaternion.LookRotation(player.position - tr.position);
    //Debug.Log(rotation);
    tr.rotation = Quaternion.Slerp(tr.rotation, rot, Time.deltaTime * Damping);
    //Debug.Log("The Enemy Has Noticed You");
    yield WaitForSeconds(TurnTime);
    anim.CrossFade(RunA.name);
    curState=enemyState.find;
  
    //waiting=true;
}
function Patrol()
{

}
function Find()
{
    NMA.stoppingDistance=intimidateDistace;
    NMA.SetDestination(player.position);
    if(distanceToPlayer<=intimidateDistace)
    {
        NMA.Stop(true);
        var iI = Random.Range(0,IntimidateA.Length);
            anim.CrossFade(IntimidateA[iI].name);
            IntimidateTime=IntimidateA[iI].length;
            curState=enemyState.intimidate;
      
    }
    if(distanceToPlayer>=noticeDistance)
    {  
        NMA.Stop();
        var xX = Random.Range(0,IdleA.Length);
        anim.CrossFade(IdleA[xX].name);
        curState=enemyState.idle;
      
    }
}
function Intimidate()
{
    var rot = Quaternion.LookRotation(player.position - tr.position);
    //Debug.Log(rotation);
    tr.rotation = Quaternion.Slerp(tr.rotation, rot, Time.deltaTime * Damping);//Debug.Log("The Enemy Has Intimidated");
    yield WaitForSeconds(IntimidateTime);
    NMA.stoppingDistance=attackDistance;
    NMA.SetDestination(player.position);
    anim.CrossFade(RunA.name);
    curState=enemyState.charge;
}
function Charge()
{
  
    if(distanceToPlayer<attackDistance)
    {
        NMA.Stop(true);
        CA = Random.Range(0,AttackA.Length);
        //CA=iI;
        anim.CrossFade(AttackA[CA].name);
        //attackRepeatTime=AttackA[iI].averageDuration;
        curState=enemyState.attack;
    }

  
    else if(distanceToPlayer>=noticeDistance)
    {  
        NMA.Stop();
        var xX = Random.Range(0,IdleA.Length);
        anim.CrossFade(IdleA[xX].name);
        curState=enemyState.idle;
    }
}
function Attack()
{
    var iI : int;
    var xX: int;
    /*if (Time.time > AttackTime)
    {
        iI = Random.Range(0,AttackA.Length);
        attackRepeatTime=AttackA[iI].averageDuration;
        anim.CrossFade(AttackA[iI].name);//Target.SendMessage("ApplyDammage", TheDammage);
      
        AttackTime = Time.time + attackRepeatTime;
    }
    else*/
    if(!anim.IsPlaying(AttackA[CA].name))
    {
        iI = Random.Range(0,AttackA.Length);
        CA=iI;
        anim.CrossFade(AttackA[CA].name);//Target.SendMessage("ApplyDammage", TheDammage);
    }
    if(distanceToPlayer>attackDistance)
    {
        xX = Random.Range(0,IdleA.Length);
        anim.CrossFade(IdleA[xX].name);
        curState=enemyState.idle;
    }
}
function Hit()
{

}
function Dead()
{

}
function Stop()
{
    NMA.Stop();
}

The only state it can get to from Attack is Idle, so are you sure it’s going Attack → Charge → Attack and not Attack → Idle → etc etc → Charge → Attack?

Toss in a ton of log statements and find out exactly what functions are being called and the state of your variables.

Yep. I watched it in the inspector go from charge to attack to charge and back to attack. It doesn’t matter now anyway. Stripped it down, rewrote it and got it working. But thanks all the same.