protected float SmoothLerp(float value, SMOOTH_TYPE mode)
    {
        float smooth = value;

        switch (mode)
        {
        case SMOOTH_TYPE.NONE:
            break;

        case SMOOTH_TYPE.EASE_IN:
            smooth = 1f - Mathf.Cos(value * Mathf.PI * 0.5f);
            break;

        case SMOOTH_TYPE.EASE_OUT:
            smooth = Mathf.Sin(value * Mathf.PI * 0.5f);
            break;

        case SMOOTH_TYPE.EXPONENTIAL:
            smooth = value * value;
            break;

        case SMOOTH_TYPE.STEP_SMOOTH:
            smooth = value * value * (3f - 2f * value);
            break;

        case SMOOTH_TYPE.STEP_SMOOTHER:
            smooth = value * value * value * (value * (6f * value - 15f) + 10f);
            break;
        }

        return(smooth);
    }
 public AbstractLerper(T start, T end, float lerpTime, SMOOTH_TYPE smoothType = SMOOTH_TYPE.NONE)
 {
     this.start      = start;
     this.end        = end;
     this.lerpTime   = lerpTime;
     this.smoothType = smoothType;
     Reached         = false;
 }
 public AbstractLerper(float lerpTime, SMOOTH_TYPE smoothType = SMOOTH_TYPE.NONE)
 {
     this.lerpTime   = lerpTime;
     this.smoothType = smoothType;
     Reached         = false;
 }
 public ColorLerper(Color start, Color end, float lerpTime, SMOOTH_TYPE smoothType = SMOOTH_TYPE.NONE) : base(start, end, lerpTime, smoothType)
 {
 }
 public ColorLerper(float lerpTime, SMOOTH_TYPE smoothType = SMOOTH_TYPE.NONE) : base(lerpTime, smoothType)
 {
 }
 public Vector3Lerper(Vector3 start, Vector3 end, float lerpTime, SMOOTH_TYPE smoothType = SMOOTH_TYPE.NONE) : base(start, end, lerpTime, smoothType)
 {
 }
 public FloatLerper(float start, float end, float lerpTime, SMOOTH_TYPE smoothType = SMOOTH_TYPE.NONE) : base(start, end, lerpTime, smoothType)
 {
 }