Рекорд
Часть раздела Создание настоящих игр путешествия по Unity на Coddy. Урок 24 из 56.
Рекорд — это лучший результат всех сыгранных игр, поэтому он хранится в PlayerPrefs и меняется, только когда игра побивает его. Этот стол для пинбола проверяет результат, когда последний шарик скатывается в лузу:
void GameOver()
{
int best = PlayerPrefs.GetInt("PinballBest", 0);
if (score > best)
{
PlayerPrefs.SetInt("PinballBest", score);
PlayerPrefs.Save();
Debug.Log("New high score: " + score);
}
}Именно сравнение делает результат рекордным. Без него игра с результатом 300 после рекорда в 5000 сохранит 300, и рекорд будет потерян. Сравнивай с сохранённым рекордом, а не со значением, которое начинается с 0 в каждой игре: поле, в которое ничего не загрузили, после каждого перезапуска равно 0, поэтому любой результат побьёт его. score > best сохраняет старый рекорд при равенстве, а score >= best сочтёт равный результат новым рекордом.
Чтобы показывать рекорд во время игры, загрузи его в поле в Start() и выведи это поле. Когда игра побьёт рекорд, обнови поле, PlayerPrefs и текст одновременно, чтобы отображаемый на экране результат никогда не расходился с сохранённым значением.
Задание
СреднеНасос для шарика: удерживай Space, чтобы накачивать шарик воздухом, зарабатывая 20 очков в секунду, и отпусти клавишу, чтобы получить очки. Если накачать больше 100, шарик лопнет, и ты получишь 0 очков. Накачивание, лопанье шарика и очки уже реализованы, а когда раунд заканчивается, EndRound() вызывается один раз, а счёт за раунд хранится в points. Добавь рекорд, сохранённый под ключом BestPoints:
- В
Start()загрузи рекорд вbest(0 для нового игрока), чтобыShowBest()отображал его. - В
EndRound(), если значениеpointsпревышает рекорд, сохрани его, отобрази и покажиnewBestText. Раунд, в котором рекорд не побит, ничего не меняет.
Нажми Play и накачай несколько шариков (Stop и Play запускают новый раунд), затем нажми Check.
Попробуйте сами
using UnityEngine;
using TMPro;
public class BalloonPump : MonoBehaviour
{
public TMP_Text pointsText;
public TMP_Text bestText;
public GameObject newBestText;
public float pumpRate = 20f;
private float air;
private int points;
private int best;
private bool roundOver;
void Start()
{
ShowBest();
}
void Update()
{
if (roundOver) return;
if (Input.GetKey(KeyCode.Space))
{
air += pumpRate * Time.deltaTime;
transform.localScale = Vector3.one * (1f + air / 50f);
pointsText.text = "Points: " + Mathf.FloorToInt(air);
if (air > 100f)
{
points = 0;
pointsText.text = "Pop! Points: 0";
GetComponent<Renderer>().enabled = false;
roundOver = true;
EndRound();
}
}
else if (Input.GetKeyUp(KeyCode.Space))
{
points = Mathf.FloorToInt(air);
pointsText.text = "Points: " + points;
roundOver = true;
EndRound();
}
}
void EndRound()
{
// Сохраните здесь новый рекорд
}
void ShowBest()
{
bestText.text = "Best: " + best;
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Создание настоящих игр
1Текст на экране
Холст и текстПокажем счётФорматирование чиселТаймер обратного отсчётаПовторение: спидометр4Сцены и уровни
Загрузить сценуПерезапустить уровеньСледующий уровеньСохранить между сценамиПовторение: выбор уровня7Управление временем
Пауза с timeScaleЗамедленное движениеНемасштабируемое времяПовторение: Bullet Time10Проект: 3D-платформер
ТрассаДвижущиеся платформы2Кнопки и экраны
Кнопки и onClickЛямбдыСвязи в InspectorВключение и выключение панелейШкалы здоровьяПовторение: магазин улучшений5Сохранение с помощью PlayerPrefs
Сохранение числаЗагрузка со значением по умолчаниюРекордСохранение настроекПовторение: монеты в банке