Menu
CoddyTech

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.

challenge icon

Görev

Kolay

Her sahne yüklemesinde çalışmaya devam eden tek bir süre sayacı tut.

  1. Awake() içinde, Instance != null ise Destroy(gameObject); ve return; çağır. Aksi takdirde Instance değerini ayarla ve DontDestroyOnLoad(gameObject); çağır.
  2. Bir yükleme eski seviyenin metnini yok eder; bu nedenle Update() içinde, metin satırından önce, clockText == null olduğunda clockText = 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

Kendi başına pratik yap: Unity playground