Настройте под себя
Урок 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: новое значение по умолчанию в коде не применяется к компоненту, уже находящемуся в сцене.
Задание
Сложно- В
GameManagerдобавьpublic TMP_Text bestText;(в сцене ему присвоен объект BestText в правом верхнем углу) иprivate int best;. - В
Start()загрузиbestиз ключаBestScore, используя 0, если ничего не сохранено, и отобрази его какBest: 0. - В
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)];
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.