/// <summary>
    /// Virtual method for performing the method.
    /// </summary>
    public virtual IEnumerator DoAction()
    {
        canGoToNextState = true;
        state = CombatantActionState.Waiting;
        while (state != CombatantActionState.Done) {
            if (canGoToNextState) {
                GoToNextState();
                if (state == CombatantActionState.Done) {
                    break;
                }
            }
            yield return StartCoroutine(StateUpdate());
        }

        yield return null;
    }
 void Start()
 {
     state = CombatantActionState.Waiting;
     StateUpdate = WaitingUpdate;
 }
    protected void GoToNextState()
    {
        canGoToNextState = false;

        switch(state) {
        case CombatantActionState.Waiting:
            state = CombatantActionState.PrecastSetup;
            StateUpdate = PrecastSetupUpdate;
            break;
        case CombatantActionState.PrecastSetup:
            state = CombatantActionState.Precast;
            StateUpdate = PrecastUpdate;
            break;
        case CombatantActionState.Precast:
            state = CombatantActionState.Cast;
            StateUpdate = CastUpdate;
            break;
        case CombatantActionState.Cast:
            state = CombatantActionState.Done;
            break;
        default:
            break;
        }
    }