public void RollOutImmediate()
    {
        if (RolledIn == true)
        {
            RolledIn = false;

            SetUnrolledAngle(unrolledAngle);

            BeforeRollOut?.Invoke(carpet);

            RollStateChanged?.Invoke(RolledIn, gameObject);
        }
    }
    private IEnumerator RollEnumerator(float time, bool state)
    {
        float elapsedTime = 0;

        float startingAngle = currentAngle;

        float endingAngle = state ? rolledAngle : unrolledAngle;

        while (elapsedTime < time)
        {
            SetUnrolledAngle(Mathf.Lerp(startingAngle, endingAngle, (elapsedTime / time)));

            elapsedTime += Time.deltaTime;

            yield return(null);
        }

        if (RolledIn != state)
        {
            RolledIn = state;

            RollStateChanged?.Invoke(RolledIn, gameObject);
        }

        if (!RolledIn)
        {
            SetUnrolledAngle(unrolledAngle);

            UnrollBegin?.Invoke(gameObject);

            RollOutIdentity?.caller.InvokeCaller(RollOutIdentity.id);
        }

        rollingIn = false;

        rollingOut = false;
    }