Menu
CoddyTech

Singleton

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

Inspector referansının sürükleyip bırakılabileceği bir şey olması gerekir. Oyun sırasında bir oluşturucunun ürettiği düşmanlar bir prefab’dan gelir ve prefab yalnızca varlıklara ve kendi parçalarına işaret edebilir, sahnedeki bir nesneye asla işaret edemez; bu nedenle GameManager alanları boştur. Olağan çözüm bir singleton kullanmaktı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 nesnesi kendi kills değerine sahip 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ı doldurması gerekmeyen, bir dakika önce oluşturulmuş bir düşman da dahil olmak üzere herhangi bir betik bu değeri okuyabilir.

Yönetici, Instance = this; atamasını Awake içinde yapar; burada this, betiğin kendisidir. Unity, sahnedeki tüm Awake işlevlerini herhangi bir Start işlevinden önce çalıştırır; bu nedenle diğer betikler, kendi Start işlevlerinden itibaren GameManager.Instance değerini kullanabilir. Sahnede ikinci bir GameManager olsaydı, Instance değerini kendisiyle değiştirirdi; Scenes and Levels bölümü bunun nasıl önleneceğini gösterir.

challenge icon

Görev

Kolay

Meteorların GameManager'a bir singleton aracılığıyla ulaşmasını sağla.

  1. GameManager.cs dosyasına public static GameManager Instance; ve Instance = this; içeren bir Awake() ekle.
  2. Meteor.cs dosyasında game alanını sil ve bunun yerine GameManager.Instance.MeteorLanded() ile GameManager.Instance.MeteorCaught() çağrılarını yap.

“Oyna” düğmesine bas ve bir meteor yakala: Konsol'da hata olmadan Caught: 1 görünür. Ardından “Kontrol et” düğmesine 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;
    }
}

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

Kendi başına pratik yap: Unity playground