private IEnumerator NextLevel()
    {
        Camera cam = Camera.main;
        eventSystem.gameObject.SetActive(false);
        
        _isTransitioning = true;
        
        // makes next background.
        _nextBackground = MakeSpriteRenderer(backgrounds.RandomOrDefault(), -2);
        Bounds b = cam.GetOrthographicBounds();
        _nextBackground.FitToBounds(new Bounds(
            b.center + new Vector3(Random.Range(1f, 4f), Random.Range(1f, 4f), 0f), 
            b.size * Random.Range(2f, 3f)),
         Space.World, true);

        // makes new foreground objects.
        int cnt = Random.Range(2, 4);
        _foregroundObjects = new List<SpriteRenderer>();
        for (int i = 0; i < cnt; i++)
        {
            StartCoroutine(SpawnAndAddForegroundObject(i, b));
        }

        // zooms out current background to be a new foreground object.
        if (_currentBackground != null)
        {
            StartCoroutine(ScaleAndAddToForegroundObject(_currentBackground));
        }

        // The next background becomes new background.
        _currentBackground = _nextBackground;
        _nextBackground.sortingOrder = -1;
        StartCoroutine(_currentBackground.transform.ScaleFrom(_currentBackground.transform.localScale * 1.5f, 1f, Ease.QuadOut));

        // music change
        musicMixer.requestNextLevel();
        soundMixer.playZoomSound();

        yield return new WaitForSeconds(1f);

        _isTransitioning = false;
        eventSystem.gameObject.SetActive(true);
    }