Level Lock/Unlocking

This level unlocking thing is really racking my brain. Last thing I like to do is ask for help.

My problem:
Staring the game, all my levels are locked except for Level 1. Which is obviously great. So I start level 1, which the object of the level is to gather 4 "soul fragments’ to move to the next level. The script works and once 4 fragments are gathered it moves you to the next level. The problem is it not only unlocks level 2, but also unlocks levels 3 & 4. Clearing level 2, unlocks level 5, etc. So I’m assuming its unlocking 4 levels up from the current level you’re on.

My Soul Fragments Collected Script

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using UnityEngine.SceneManagement;


public class SFCollected : MonoBehaviour
{
    private int fragments = 0;
    public int nextSceneLoad;

    [SerializeField] private TextMeshProUGUI fragmentsText;

    void Start()
    {
        nextSceneLoad = SceneManager.GetActiveScene().buildIndex + 1;
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.CompareTag("Fragment"))
        {
            Destroy(collision.gameObject);
            fragments++;
            fragmentsText.text = "x " + fragments;
        }

        if (fragments is 4)
        {
            SceneManager.LoadScene(nextSceneLoad);

            if(nextSceneLoad > PlayerPrefs.GetInt("levelsUnlocked"))
            {
                PlayerPrefs.SetInt("levelsUnlocked", nextSceneLoad);
            }
        }
    }
}

Level Manager Script

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;


public class LevelManager : MonoBehaviour
{
    int levelsUnlocked;
    public SceneFader fader;
    public Button[] buttons;

    void Start()
    {
        levelsUnlocked = PlayerPrefs.GetInt("levelsUnlocked", 1);

        for (int i = 0; i < buttons.Length; i++)
        {
            buttons[i].interactable = false;
        }

        for (int i = 0; i < levelsUnlocked; i++)
        {
            buttons[i].interactable = true;
        }
    }

    public void LoadLevel(int levelIndex)
    {
        SceneManager.LoadScene(levelIndex);
    }

    public void Select (string levelName)
    {
        fader.FadeTo(levelName);
    }

}

Help is greatly appreciated!

My first suggestion is to Debug.Log the values that matter and see if they meet your expectations. Particularly this ‘levelsUnlocked’ value. Find out what you’re value you’re setting in your player prefs, and what value you’re reading out of it.

Of course player prefs should not be used for save data. Were you serialising out data to JSON it would be trivial to see what values you’re outputting. Though I would personally use a scriptable object to record this information.