Menu
CoddyTech

Рекорд

Часть раздела Создание настоящих игр путешествия по 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 и текст одновременно, чтобы отображаемый на экране результат никогда не расходился с сохранённым значением.

challenge icon

Задание

Средне

Насос для шарика: удерживай 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;
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Создание настоящих игр