Sahneler Arasında Saklama
Coddy'nin Unity Journey'sinin Gerçek Oyunlar Geliştirmek bölümünün bir parçası. Ders 20 / 56.
Bir sahne yüklendiğinde eski sahnedeki her nesne yok edilir, ancak oyuncunun bir seviyeden diğerine taşıdığı paralar gibi bazı şeylerin oyun boyunca kalması gerekir. DontDestroyOnLoad(gameObject), bir nesneyi 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 ona asla dokunmaz. Yalnızca kök bir nesnede ç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 yaşar. Play sırasıyla Menu, Level1 ve sonra tekrar Menu'den geçer; Menu, korunan GameSession hâlâ oradayken, yeni bir GameSession da dahil olmak üzere tüm nesnelerini yeniden oluşturur. Awake içindeki kontrol olmasaydı iki tane olurdu ve yeni gelen, 0 parayla Instance'ın yerini alırdı. Kontrol sayesinde yeni gelen, Instance'ın zaten ayarlanmış olduğunu görür, kendini yok eder ve durur; seviyeler boyunca gelen oturum ise kalır.
return önemlidir, çünkü Destroy kare sonuna kadar bekler. Olmasaydı Awake'in geri kalanı yeni gelen için yine çalışırdı: Instance = this;, her betiği yok edilmek üzere olan bir nesneye yönlendirirdi.
Görev
KolayBir hız koşusu saati. Level1'deki RunClock nesnesi tüm koşunun saniyelerini sayar ve her bölüm tamamlandığında bir ara süre kaydeder. Level1'in altın Goal'u Level2'yi yükler; Level2'nin hedefi de Level1'i tekrar yükler ve her hedef önce RunClock.Instance.Split() çağırır. Her seviyenin kendi HUD'ı ve bir ClockText'i vardır; Inspector, RunClock'a Level1'deki saati verir. Oklar Player'ı hareket ettirir. RunClock.cs dosyasını şöyle değiştir:
- saat, sıfırlanmadan her sahne yüklemesi boyunca çalışmaya devam etsin;
- süre, açık olan seviyenin
ClockText'inde her zamanTime: 12.3biçiminde görünsün; - kendi RunClock'una sahip Level1'e geri dönüldüğünde bile çalışan saat olmak üzere tek bir saat kalsın ve
RunClock.Instanceo saati göstersin.
Play'e bas, Level2'ye gidip geri dön ve ardından Level1'i tekrar tamamla; sonra Check'e 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"));
}
}
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 Paralar