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.
Görev
KolayMeteorların GameManager'a bir singleton aracılığıyla ulaşmasını sağla.
GameManager.csdosyasınapublic static GameManager Instance;veInstance = this;içeren birAwake()ekle.Meteor.csdosyasındagamealanını sil ve bunun yerineGameManager.Instance.MeteorLanded()ileGameManager.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
1Ekrandaki Metinler
Canvas ve MetinSkoru GösterSayıları BiçimlendirGeri Sayım ZamanlayıcısıTekrar: Hız Göstergesi2Düğmeler ve Ekranlar
Düğmeler ve onClickLambda İfadeleriInspector'da Bağlantı KurmaPanelleri Açma ve KapamaCan ÇubuklarıTekrar: Yükseltme Mağazası5PlayerPrefs ile Kaydetme
Bir Sayı KaydetmeVarsayılan Değerle YüklemeEn Yüksek SkorAyarları KaydetmeTekrar: Bankadaki Paralar3Oyun Yöneticisi
Oyunu Tek Bir Betik YönetiyorSingletonOyun DurumlarıDuruma Göre GeçişÖzet: Tur YöneticisiKendi başına pratik yap: Unity playground