You are basically always saving the time as highscore. The comments are explaining why your current code is not doing what it should.
//Here you save already to your playerPref
PlayerPrefs.SetFloat("Minutes", minutes);
PlayerPrefs.SetFloat("Seconds", seconds);
timeText.text = string.Format("{0:00}:{1:00}", minutes, seconds);
//Here you load the same time that you just saved
float highscoreMins = PlayerPrefs.GetFloat("Minutes");
float highscoreSec = PlayerPrefs.GetFloat("Seconds");
//This condition does nothing since the time is the same value and we saved it already
if (minutes > highscoreMins || seconds > highscoreSec)
{
PlayerPrefs.SetFloat("Minutes", minutes);
PlayerPrefs.SetFloat("Seconds", seconds);
}
If you need a highscore per level, you might add a level prefix. And you can always save the time in total seconds since you even have the time already in seconds. For display purpose you convert it, for saving it is not needed. Keep it simple with one value.
You should as well not mix saving and displaying. Make an extra saving function that can determinate handles saving your highscore.
(Your display method should as well not handle the increase of time, this is another part you should rework)
void DisplayTime(float timeToDisplay){
timeToDisplay += 1;
float minutes = Mathf.FloorToInt(timeToDisplay / 60);
float seconds = Mathf.FloorToInt(timeToDisplay % 60);
timeText.text = string.Format("{0:00}:{1:00}", minutes, seconds);
}
void SaveIfHighScore(float time, string level){
float currentHighscore = PlayerPrefs.GetFloat("Time_" + level);
if (time > currentHighscore) {
PlayerPrefs.SetFloat("Time_" + level, time)
}
}
This assumes that highscore means the longer time, the better it is. If you need it to be fastest time, you need to switch the >.