Dostosuj do siebie
Lekcja 14 z 14 w kursie Gra w Unity: Wąż 3D w Coddy.
Pozostała jeszcze jedna funkcja: najlepszy wynik, który nie znika po zamknięciu gry. PlayerPrefs go przechowuje: odczytaj go z wartością domyślną w Start() i zapisz przy końcu gry, gdy wynik go pobije. Gra wyścigowa przechowuje najlepsze okrążenie na odwrót, ponieważ krótszy czas jest lepszy:
if (lapTime < bestLap)
{
bestLap = lapTime;
PlayerPrefs.SetFloat("BestLap", bestLap);
}Teraz możesz dostosować grę do swoich upodobań. Wartości liczbowe w Snake określają jej charakter: tick równy 0.25 zapewnia spokojny początek, a 0.1 — szybki; speedUp równy 0.01 sprawia, że wąż szybciej przyspiesza, a minTick równy 0.05 zapewnia szaleńczą końcówkę gry. Inspektor tego gracza jest tylko do odczytu, a scena kursu pozostawia te trzy pola z wartościami z Twojego kodu, więc zmień je w miejscu, w którym są zadeklarowane, i naciśnij Play. We własnym projekcie Unity zmień je w komponencie Snake w Inspektorze: nowa wartość domyślna w kodzie nie zostanie zastosowana do komponentu, który już znajduje się w scenie.
Wyzwanie
TrudnyZachowaj najlepszy wynik między rozgrywkami, a następnie dostosuj grę.
- W
GameManagerdodajpublic TMP_Text bestText;orazprivate int best; - W
Start()użyjbest = PlayerPrefs.GetInt("BestScore", 0);i wyświetl"Best: " + best. - W
GameOver(), gdy wynik jest lepszy od najlepszego, ustaw najlepszy wynik, zapisz go pod nazwąBestScorei wyświetl go. - Dostosuj
tick,speedUpiminTickw miejscu ich deklaracji w Snake.
Naciśnij „Graj”, osiągnij najlepszy wynik i zagraj ponownie: najlepszy wynik pozostanie w prawym górnym rogu. Następnie naciśnij „Sprawdź”.
Spróbuj swoich sił
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)];
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Gra w Unity: Wąż 3D
Poćwicz samodzielnie: Edytor online Unity