Menu
CoddyTech

Singleton

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

Inspector başvurusu, sürükleyip bırakabileceğin bir şey gerektirir. Oyun sırasında bir spawner'ın oluşturduğu düşmanlar bir prefab'den gelir ve bir prefab yalnızca varlıklara ve kendi parçalarına başvurabilir; sahnedeki bir nesneye asla başvuramaz. Bu yüzden GameManager alanları boştur. Bunun yaygın çözümü bir singleton'dır: GameManager kendisini, her betiğin sınıf adı üzerinden erişebileceği bir alanda saklar.

public class GameManager : MonoBehaviour
{
    public static GameManager Instance;
    private int kills;

    void Awake()
    {
        Instance = this;
    }

    public void EnemyDown()
    {
        kills++;
        Debug.Log("Kills: " + kills);
    }
}
// Enemy.cs, düşman prefab'ında
public void Die()
{
    GameManager.Instance.EnemyDown();
    Destroy(gameObject);
}

static, alanın bir nesneye değil sınıfa ait olduğu anlamına gelir. Her GameManager nesnesinin kendine ait bir kills değeri olurdu, ancak oyunun tamamında yalnızca bir Instance vardır ve ona sınıf adıyla erişirsin: GameManager.Instance. Kendi alanını doldurman gerekmeden, bir dakika önce oluşturulmuş bir düşman da dahil olmak üzere her betik bu değeri okuyabilir.

Yönetici, Instance = this; ifadesini Awake içinde ayarlar; burada this betiğin kendisidir. Unity, sahnedeki tüm Awake metotlarını herhangi bir Start metodu çalışmadan önce çalıştırır; böylece diğer betikler Start metotlarından itibaren GameManager.Instance değerini kullanabilir. Sahnede ikinci bir GameManager olursa Instance değerini kendisiyle değiştirir; Scenes and Levels bölümü bunun nasıl önleneceğini gösterir.

challenge icon

Görev

Kolay

Göktaşları yağmur gibi yağıyor. Spawner, her 1.5 saniyede bir bir prefab'dan Meteor oluşturuyor, oklar Player'ı hareket ettiriyor ve GameManager, MeteorCaught() ile yakalananları ve yere çarpan göktaşlarını MeteorLanded() ile sayıyor. Bu betikler hazır.

Meteor betiği game alanı üzerinden rapor veriyor, ancak göktaşları bir prefab'dan geldiği için game boş ve her rapor başarısız oluyor. Bir singleton kullanarak düzelt:

  • GameManager.cs içinde, GameManager türünde bir public static Instance alanı ekle ve Awake içinde bu betiğe ata.
  • Meteor.cs içinde, game alanını sil ve bunun yerine GameManager.Instance üzerinden rapor ver.

Play'e bas, birkaç göktaşı yakala ve birkaçını kaçır, ardından Check'e bas.

Kendin dene

using UnityEngine;
using TMPro;

public class GameManager : MonoBehaviour
{
    public TMP_Text caughtText;
    public TMP_Text shieldText;
    private int caught;
    private int shield = 3;

    public void MeteorCaught()
    {
        caught++;
        caughtText.text = "Caught: " + caught;
    }

    public void MeteorLanded()
    {
        shield--;
        shieldText.text = "Shield: " + shield;
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

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