Menu
CoddyTech

Настройте под себя

Урок 14 из 14 курса Игра на Unity: 3D-змейка на Coddy.

Осталась одна возможность: лучший результат, который сохраняется после закрытия игры. Его хранит PlayerPrefs: считайте его в Start(), указав значение по умолчанию, и сохраняйте при завершении игры, если результат превысил рекорд. В гоночной игре лучший круг сохраняется иначе, поскольку меньшее время лучше:

if (lapTime < bestLap)
{
    bestLap = lapTime;
    PlayerPrefs.SetFloat("BestLap", bestLap);
}

Теперь игру можно настроить по своему вкусу. Значения в Snake определяют её характер: tick со значением 0.25 задаёт спокойное начало, а 0.1 — быстрое; speedUp со значением 0.01 ускоряет змею раньше, а minTick со значением 0.05 делает финал игры напряжённым. Inspector этого игрока доступен только для чтения, а сцена курса оставляет эти три поля со значениями из вашего кода, поэтому измените их там, где они объявлены, и нажмите Play. В собственном проекте Unity измените их у компонента Snake в Inspector: новое значение по умолчанию в коде не применяется к компоненту, уже находящемуся в сцене.

challenge icon

Задание

Сложно
  1. В GameManager добавь public TMP_Text bestText; (в сцене ему присвоен объект BestText в правом верхнем углу) и private int best;.
  2. В Start() загрузи best из ключа BestScore, используя 0, если ничего не сохранено, и отобрази его как Best: 0.
  3. В GameOver(), если score превышает best, присвой ему значение score, сохрани его под ключом BestScore и отобрази его.

Нажми Play, затем нажми Check. Затем поиграй и настрой tick, speedUp и minTick, пока игра не станет ощущаться так, как тебе нравится.

Попробуйте сами

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using TMPro;

public class GameManager : MonoBehaviour
{
    public static GameManager Instance;

    public Snake snake;
    public GameObject foodPrefab;
    public TMP_Text scoreText;
    public GameObject gameOverPanel;
    public Button playAgainButton;
    private Transform food;
    private int score;

    void Awake()
    {
        Instance = this;
    }

    void Start()
    {
        scoreText.text = "Score: 0";
        playAgainButton.onClick.AddListener(PlayAgain);
        food = Instantiate(foodPrefab).transform;
        MoveFood();
    }

    public bool IsFood(Vector3 cell)
    {
        return cell == food.position;
    }

    public void Eat()
    {
        score++;
        scoreText.text = "Score: " + score;
        MoveFood();
    }

    public void GameOver()
    {
        gameOverPanel.SetActive(true);
    }

    void PlayAgain()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
    }

    void MoveFood()
    {
        List<Vector3> free = new List<Vector3>();
        for (int x = -snake.edge; x <= snake.edge; x++)
        {
            for (int z = -snake.edge; z <= snake.edge; z++)
            {
                Vector3 cell = new Vector3(x, 0f, z);
                if (!snake.Occupies(cell))
                {
                    free.Add(cell);
                }
            }
        }
        food.position = free[Random.Range(0, free.Count)];
    }
}
quiz iconПроверьте себя

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

Все уроки раздела Игра на Unity: 3D-змейка