Menu
CoddyTech

Jeden skrypt obsługuje grę

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

Umieść wynik w skrypcie gracza, liczbę żyć w skrypcie zdrowia, a sprawdzanie końca gry w trzecim skrypcie — każdy skrypt potrzebuje więc danych pozostałych, a każda nowa zasada wymaga zmian w kilku plikach. W grach Unity te dane zwykle są przechowywane w jednym skrypcie, GameManager, przypisanym do osobnego, pustego obiektu GameObject. Zarządza on wynikiem, liczbą żyć i zasadą kończącą grę. Inne skrypty jedynie zgłaszają, co się wydarzyło, wywołując jego publiczne metody. W tej serii rzutów karnych bramka zgłasza każdy gol:

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);
}

Bramka 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 rozegrać serię 3 strzałów, zmieniasz jedną liczbę w jednym skrypcie. Sprawdzenie na początku metody ShotTaken zapobiega zaliczeniu piłki, która wtoczy się do bramki po końcu meczu.

Uzupełniasz pole game w Inspectorze, przeciągając na nie obiekt GameManager, a Unity znajduje skrypt GameManager na tym obiekcie. Menedżer jest również miejscem, w którym obsługuje się HUD: gdy przechowuje tekst wyniku i panel końca gry, ekran zmienia się w tej samej metodzie, która zmienia liczby, a żaden inny skrypt nie dotyka interfejsu użytkownika.

challenge icon

Wyzwanie

Łatwy

Polowanie na klejnoty. Strzałki poruszają graczem (jego skrypt jest gotowy). Klejnoty są warte tyle, ile wynosi ich points, bomby kosztują życie, a nad wszystkim czuwa GameManager. Inspector już łączy pole game każdego klejnotu i każdej bomby z obiektem GameManager, a pola GameManager z HUD-em i graczem.

W GameManager.cs:

  • AddScore(int points) dodaje punkty do score i wyświetla je w scoreText jako Score: 6.
  • LoseLife() odejmuje 1 od lives (na początku są 3) i wyświetla je w livesText jako Lives: 2.
  • Gdy lives osiągnie 0, gra się kończy: pokaż gameOverPanel i wyłącz skrypt gracza, aby strzałki przestały działać. Potem AddScore już niczego nie zmienia.

W Gem.cs i Bomb.cs: gdy gracz (oznaczony tagiem Player) dotknie klejnotu lub bomby, obiekt zgłasza to do gry (klejnot przekazuje swoje points, a bomba utratę życia) i usuwa się.

Naciśnij Play, zbieraj klejnoty i dotykaj bomb, a następnie naciśnij Check.

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 życiach gra się kończy
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Tworzenie prawdziwych gier