#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. Я обновил свой ответ, включив в него свое предложение.