Sahneler Arasında Saklama
Coddy'nin Unity Journey'sinin Gerçek Oyunlar Geliştirmek bölümünün bir parçası. Ders 20 / 60.
Bir sahne yüklendiğinde eski sahnedeki tüm nesneler yok edilir, ancak oyuncunun bir seviyeden diğerine taşıdığı jetonlar gibi bazı şeylerin oyun boyunca kalması gerekir. DontDestroyOnLoad(gameObject), bir nesneyi kendi sahnesinden çıkarıp kendine ait bir sahneye taşır; bu sahne, Play sırasında Hierarchy'de DontDestroyOnLoad olarak adlandırılır ve sahne yüklemeleri bu sahneye dokunmaz. Yalnızca kök nesnelerde çalışır: bir alt nesnede kullanılırsa Unity bir uyarı kaydeder ve hiçbir şeyi korumaz. Korunan nesnenin alt nesneleri de onunla birlikte gelir, ancak yalnızca işaret ettiği nesneler gelmez: yüklemeden sonra eski sahnedeki bir nesneyi işaret eden alan, yok edilmiş bir nesneyi tutar ve bu nesne null ile eşit kabul edilir.
public class GameSession : MonoBehaviour
{
public static GameSession Instance;
public int coins;
void Awake()
{
if (Instance != null)
{
Destroy(gameObject);
return;
}
Instance = this;
DontDestroyOnLoad(gameObject);
}
}Bu GameSession, Menu sahnesinde bulunur. “Oyna”ya basıldığında Menu, Level1 ve ardından tekrar Menu açılır; Menu, korunan GameSession da dâhil olmak üzere tüm nesnelerini yeniden oluştururken korunan GameSession hâlâ oradadır. Awake içindeki kontrol olmasaydı iki tane olurdu ve yeni gelen, 0 jetonla Instance'ın yerini alırdı. Kontrol sayesinde yeni gelen Instance'ın zaten ayarlanmış olduğunu görür, kendini yok eder ve durur; seviyeleri geçerek gelen oturum ise kalır.
return önemlidir, çünkü Destroy kare sonuna kadar bekler. Bu olmazsa yeni gelen için Awake'in geri kalanı yine çalışırdı: Instance = this;, tüm betiklerin yok edilmek üzere olan bir nesneyi göstermesine neden olurdu.
Görev
KolayHer sahne yüklemesinde çalışmaya devam eden tek bir süre sayacı tut.
Awake()içinde,Instance != nulliseDestroy(gameObject);vereturn;çağır. Aksi takdirdeInstancedeğerini ayarla veDontDestroyOnLoad(gameObject);çağır.- Bir yükleme eski seviyenin metnini yok eder; bu nedenle
Update()içinde, metin satırından önce,clockText == nullolduğundaclockText = GameObject.Find("ClockText").GetComponent<TMP_Text>();değerini ayarla.
“Oyna” düğmesine bas, Level2'ye git ve geri dön: tek bir süre sayacı saymaya devam eder. Ardından “Kontrol et” düğmesine bas.
Kendin dene
using UnityEngine;
using TMPro;
public class RunClock : MonoBehaviour
{
public static RunClock Instance;
public TMP_Text clockText;
private float seconds;
void Awake()
{
Instance = this;
}
void Update()
{
seconds += Time.deltaTime;
clockText.text = "Time: " + seconds.ToString("0.0");
}
public void Split()
{
Debug.Log("Split: " + seconds.ToString("0.0"));
}
}
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çimi2Düğ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 ParalarKendi başına pratik yap: Unity playground