Menu
CoddyTech

Oyunu Tek Bir Betik Yönetiyor

Coddy'nin Unity Journey'sinin Gerçek Oyunlar Geliştirmek bölümünün bir parçası. Ders 12 / 60.

Skoru oyuncunun betiğine, canları sağlık betiğine, oyun sonu kontrolünü de üçüncü bir betiğe koyarsan her betiğin diğerlerinin sayılarına ihtiyacı olur; böylece her yeni kural birden çok dosyayı etkiler. Unity oyunlarında bu sayılar genellikle kendine ait boş bir GameObject üzerindeki GameManager betiğinde tutulur. Bu betik skoru, canları ve oyunu bitiren kuralı yönetir. Diğer betikler yalnızca olanları, herkese açık yöntemlerini çağırarak bildirir. Bu penaltı atışlarında her golü kale bildirir:

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, kalenin tetikleyicisinde
public GameManager game;

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

Kale, kaç atış kaldığını veya oyunun ne zaman biteceğini bilmez. Bir gol olduğunu bildirir, bunun ne anlama geldiğine yönetici karar verir; kalecinin betiği ise kurtarışı game.ShotTaken(false) ile bildirir. 3 atışlık bir penaltı atışması için tek bir betikteki tek bir sayıyı değiştirirsin. ShotTaken yönteminin başındaki kontrol, uzatma süresi bittikten sonra kaleye giren bir topun sayılamasını önler.

game alanını Inspector'da GameManager nesnesini üzerine sürükleyerek doldurursun; Unity de bu nesnedeki GameManager betiğini bulur. Yönetici, HUD için de doğru yerdir: skor metnini ve oyun sonu panelini tuttuğunda ekran, sayıları değiştiren yöntem içinde güncellenir ve başka hiçbir betik kullanıcı arayüzüne dokunmaz.

challenge icon

Görev

Kolay

GameManager'ın puanı ve canları tutmasını sağla.

  1. AddScore(int points): gameOver değilse score'a ekle ve scoreText'te Score: 6 göster.
  2. LoseLife(): lives'tan 1 çıkar ve Lives: 2 göster; değer 0 olduğunda gameOver'ı ayarla, gameOverPanel'i göster, player.enabled = false olarak ayarla.
  3. Gem ve Bomb içinde, other.CompareTag("Player") olduğunda game.AddScore(points) veya game.LoseLife() çağır, ardından Destroy(gameObject) çağır.

“Oyna”ya bas ve üç bombaya çarp. Ardından “Kontrol et”e bas.

Kendin dene

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)
    {
        // Oyun bitmediyse puanları ekle ve yeni skoru göster
    }

    public void LoseLife()
    {
        // Bir can eksilt ve kalan can sayısını göster; 0 can kaldığında oyun biter
    }
}

Gerçek Oyunlar Geliştirmek bölümündeki tüm dersler

Kendi başına pratik yap: Unity playground