public override void UpdateAction(AIStateController controller)
    {
        controller.SetFloat(TIMER_KEY, controller.getFloat(TIMER_KEY) + Time.deltaTime);

        if (controller.getFloat(TIMER_KEY) >= controller.getFloat(CUR_TIME_BEFORE_DIR_CHANGE_KEY))
        {
            controller.SetFloat(STOP_TIMER_KEY, controller.getFloat(STOP_TIMER_KEY) + Time.deltaTime);

            if (controller.getFloat(STOP_TIMER_KEY) >= controller.getFloat(CUR_STOP_TIME_KEY))
            {
                Resume(controller);
            }
        }
        else
        {
            DiscreteMovement.MoveDiscrete(controller.GetRigidbody(), GetCurMovingDirection(controller), speed);
            DiscreteMovement.RotateDiscrete(controller.GetRigidbody(), GetCurMovingDirection(controller));
        }
    }
    public override void Init(AIStateController controller)
    {
        if (controller.GetRigidbody() == null)
        {
            throw new AIException("Rigidbody component in AIStateController: " + controller + " is neccessary");
        }

        InitCurStopTime();
        InitCurTimeBeforeChangeDirection();

        Resume(controller);
    }