Menu
CoddyTech

Jeden skrypt obsługuje grę

Część sekcji Tworzenie prawdziwych gier ścieżki Unity w Coddy. Lekcja 12 z 60.

Umieść wynik w skrypcie gracza, życia w skrypcie zdrowia, a sprawdzanie końca gry w trzecim skrypcie. Każdy skrypt potrzebuje więc wartości z pozostałych, a każda nowa zasada wymaga zmian w kilku plikach. W grach Unity te wartości zwykle przechowuje jeden skrypt, GameManager, umieszczony na osobnym, pustym obiekcie GameObject. Zarządza on wynikiem, życiami i zasadą kończącą grę. Pozostałe skrypty tylko zgłaszają, co się wydarzyło, wywołując jego metody publiczne. W tej serii rzutów karnych siatka zgłasza każdego gola:

public class GameManager : MonoBehaviour
{
    private int goals;
    private int shotsLeft = 5;

    public void ShotTaken(bool scored)
    {
        if (shotsLeft == 0) return;
        shotsLeft--;
        if (scored) goals++;
        Debug.Log("Goals: " + goals + ", shots left: " + shotsLeft);
        if (shotsLeft == 0) Debug.Log("Full time: " + goals + " goals");
    }
}
// Net.cs, na wyzwalaczu bramki
public GameManager game;

void OnTriggerEnter(Collider other)
{
    if (other.CompareTag("Ball")) game.ShotTaken(true);
}

Siatka nie wie, ile strzałów pozostało ani kiedy kończy się gra. Zgłasza gola, a menedżer decyduje, co to oznacza; skrypt bramkarza zgłasza obronę za pomocą game.ShotTaken(false). Aby rozgrywka obejmowała 3 strzały, wystarczy zmienić jedną liczbę w jednym skrypcie. Sprawdzenie na początku ShotTaken zapobiega zaliczeniu piłki, która wtoczy się do bramki po końcu gry.

Wypełnij pole game w Inspectorze, przeciągając na nie obiekt GameManager. Unity znajdzie skrypt GameManager na tym obiekcie. Menedżer jest też miejscem na HUD: gdy przechowuje tekst wyniku i panel końca gry, ekran zmienia się w tej samej metodzie, która zmienia wartości, a żaden inny skrypt nie dotyka interfejsu użytkownika.

challenge icon

Wyzwanie

Łatwy

Pozwól, aby GameManager śledził wynik i liczbę żyć.

  1. AddScore(int points): jeśli nie gameOver, dodaj do score i wyświetl Score: 6 w scoreText.
  2. LoseLife(): odejmij 1 od lives i wyświetl Lives: 2; przy 0 ustaw gameOver, pokaż gameOverPanel, ustaw player.enabled = false.
  3. W Gem i Bomb, gdy other.CompareTag("Player"), wywołaj game.AddScore(points) lub game.LoseLife(), a następnie Destroy(gameObject).

Naciśnij „Graj” i uderz w trzy bomby. Następnie naciśnij „Sprawdź”.

Spróbuj swoich sił

using UnityEngine;
using TMPro;

public class GameManager : MonoBehaviour
{
    public TMP_Text scoreText;
    public TMP_Text livesText;
    public GameObject gameOverPanel;
    public Player player;
    private int score;
    private int lives = 3;
    private bool gameOver;

    public void AddScore(int points)
    {
        // dodaj punkty i wyświetl nowy wynik, chyba że gra się skończyła
    }

    public void LoseLife()
    {
        // odejmij jedno życie i wyświetl pozostałą liczbę żyć; przy 0 żyć gra się kończy
    }
}

Wszystkie lekcje w sekcji Tworzenie prawdziwych gier

Poćwicz samodzielnie: Edytor online Unity