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.
Görev
KolayGö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.csiçinde, GameManager türünde bir public staticInstancealanı ekle ve Awake içinde bu betiğe ata.Meteor.csiçinde,gamealanını sil ve bunun yerineGameManager.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;
}
}
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
1Ekrandaki Metinler
Canvas ve MetinSkoru GösterSayıları BiçimlendirGeri Sayım ZamanlayıcısıTekrar: Hız Göstergesi4Sahneler ve Bölümler
Bir Sahne YüklemeBölümü Yeniden BaşlatmaSonraki BölümSahneler Arasında SaklamaTekrar: Bölüm Seçimi10Proje: 3D Platform Oyunu
ParkurHareketli Platformlar2Düğ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öneticisi