Единство показывает лучшие времена

#c# #unity3d #timer

Вопрос:

Я новичок в Unity и нуждаюсь в некоторой помощи. Я сделал простую игру, в которой вы пытаетесь пройти несколько уровней как можно быстрее. У меня есть скрипт таймера, который я хочу использовать для сохранения лучших времен в таблице в главном меню. Я рассмотрел некоторые решения с помощью playerprefs, но я все еще немного растерян и был бы очень благодарен, если бы кто-нибудь мог провести меня через это.

Скрипт таймера:

 public class Timercontroller : MonoBehaviour
 

{

 public Text timeCounter;

public TimeSpan timePlaying;
public bool timerGoing;
public float elapsedTime;


public void Awake()
{
    DontDestroyOnLoad(this.gameObject);
}


void Start()
{
    timeCounter.text = "Time: 00:00.00";
    timerGoing = false;
    BeginTimer();
    
}

public void BeginTimer()
{
    timerGoing = true;
    elapsedTime = 0f;
    StartCoroutine(UpdateTimer());

}

public void EndTimer()
{
    timerGoing = false;

}

public IEnumerator UpdateTimer()
{
    while (timerGoing)
    {
        elapsedTime  = Time.deltaTime;
        timePlaying = TimeSpan.FromSeconds(elapsedTime);
        string timePlayingString = "Time: "   timePlaying.ToString("mm':'ss'.'ff");
        timeCounter.text = timePlayingString;

        yield return null;

    }

}

void Update()
{
    int currentSceneIndex = SceneManager.GetActiveScene().buildIndex;
         if (currentSceneIndex == 5) {
        EndTimer();
             }
 
}
 

}

Ответ №1:

Вы просто ищете совет по экономии таймеров? Итак, предполагая, что ваш код верен и вы просто хотите сэкономить время загрузки/загрузки, я бы сделал что-то вроде следующего:

 List<float> bestTimes = new List<float>();
int totalScores = 5; // the total times you want to save


/// <summary>
///  Call this in Awake to load in your data.
///  It checks to see if you have any saved times and adds them to the list if you do.
/// </summary>
public void LoadTimes() {
    for (int i = 0; i < totalScores; i  ) {
        string key = "time"   i;
        if (PlayerPrefs.HasKey(key)) {
            bestTimes.Add(PlayerPrefs.GetFloat(key));
        }
    }
}

/// <summary>
/// Call this from your EndTimer method. 
/// This will check and see if the time just created is a "best time".
/// </summary>
public void CheckTime(float time) {
    // if there are not enough scores in the list, go ahead and add it
    if (bestTimes.Count < totalScores) {
        bestTimes.Add(time);

        // make sure the times are in order from highest to lowest
        bestTimes.Sort((a, b) => b.CompareTo(a));
        SaveTimes();
    } else {

        for (int i = 0; i < bestTimes.Count; i  ) {
            // if the time is smaller, insert it
            if (time < bestTimes[i]) {
                bestTimes.Insert(i, time);

                // remove the last item in the list
                bestTimes.RemoveAt(bestTimes.Count - 1);
                SaveTimes();
                break;
            }
        }
    }
}

/// <summary>
/// This is called from CheckTime().
/// It saves the times to PlayerPrefs.
/// </summary>
public void SaveTimes() {
    for (int i = 0; i < bestTimes.Count; i  ) {
        string key = "time"   i;
        PlayerPrefs.SetFloat(key, bestTimes[i]);
    }
}
 

У меня не было возможности проверить это, но мне кажется, что это сработает.

Чтобы обновить текст в списке рекордов, предполагая, что все они являются текстовыми объектами, я бы создал новый скрипт, добавил его к каждому текстовому объекту и добавил в код следующее:

 private void Awake(){
    int index = transform.SetSiblingIndex();
    Text theText = GetComponent<Text>().text;
    if (PlayerPrefs.HasKey(index)) {
        theText = PlayerPrefs.GetFloat(index).ToString();
    }else{
        theText = "0";
    }
}
 

Я не форматировал текст выше, но это небольшая корректировка.

Комментарии:

1. Большое спасибо, это, кажется, работает и пока не дает никаких ошибок. Но как я могу на самом деле получить баллы, чтобы они отображались в моем списке рекордов в главном меню?

2. Я обновил свой ответ, включив в него свое предложение.