Menu
CoddyTech

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.

challenge icon

Wyzwanie

Trudny
  1. W GameManager dodaj public TMP_Text bestText; (scena ustawia go na BestText, w prawym górnym rogu) oraz private int best;.
  2. W Start() wczytaj best z klucza BestScore, używając wartości 0, jeśli nic nie zostało zapisane, i wyświetl go jako Best: 0.
  3. W GameOver(), gdy score przewyższy best, ustaw go jako najlepszy wynik, zapisz pod kluczem BestScore i wyświetl.

Naciśnij Play, a następnie Check. Potem zagraj i dostosuj tick, speedUp oraz minTick, aż gra będzie działać tak, jak lubisz.

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)];
    }
}
quiz iconSprawdź się

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