Menu
CoddyTech

Pertahankan Antar-Scene

Termasuk bagian Membangun Game Sungguhan dalam perjalanan Unity di Coddy. Pelajaran 20 dari 56.

Memuat scene menghancurkan setiap object dari scene lama, tetapi beberapa hal harus bertahan sepanjang game, seperti koin yang dibawa pemain dari level ke level. DontDestroyOnLoad(gameObject) memindahkan object keluar dari scene-nya ke scene tersendiri, yang disebut DontDestroyOnLoad di Hierarchy saat Play, dan tidak pernah tersentuh saat pemuatan. Ini hanya berfungsi pada object root: jika diterapkan pada child, Unity mencatat peringatan dan tidak mempertahankan apa pun. Child dari object yang dipertahankan ikut terbawa, tetapi object yang hanya ditunjuk olehnya tidak: setelah pemuatan, field yang menunjuk ke object dari scene lama akan berisi object yang sudah dihancurkan, dan nilainya sama dengan null.

public class GameSession : MonoBehaviour
{
    public static GameSession Instance;
    public int coins;

    void Awake()
    {
        if (Instance != null)
        {
            Destroy(gameObject);
            return;
        }
        Instance = this;
        DontDestroyOnLoad(gameObject);
    }
}

GameSession ini berada di scene Menu. Saat Play, urutannya adalah Menu, Level1, lalu kembali ke Menu. Menu membangun ulang semua object-nya, termasuk GameSession baru, sementara GameSession yang dipertahankan masih ada. Tanpa pemeriksaan di Awake, akan ada dua GameSession, dan GameSession baru akan mengambil alih Instance dengan 0 koin. Dengan pemeriksaan itu, GameSession baru mendapati Instance sudah diatur, menghancurkan dirinya sendiri lalu berhenti, sementara GameSession yang melewati level-level tadi tetap ada.

return penting karena Destroy menunggu hingga akhir frame. Tanpanya, sisa kode di Awake tetap berjalan untuk GameSession baru: Instance = this; akan membuat setiap script menunjuk ke object yang akan segera dihancurkan.

challenge icon

Tantangan

Mudah

Jam speedrun. object RunClock di Level1 menghitung detik sepanjang run dan mencatat split setiap kali sebuah level selesai. Goal berwarna emas di Level1 memuat Level2, yang goal-nya memuat Level1 lagi, dan setiap goal memanggil RunClock.Instance.Split() terlebih dahulu. Setiap level memiliki HUD sendiri dengan ClockText; Inspector memberikan ClockText di Level1 kepada RunClock. Panah menggerakkan Player. Ubah RunClock.cs agar:

  • jam terus berjalan setiap kali scene dimuat, tanpa memulai ulang;
  • waktu selalu ditampilkan di ClockText pada level yang sedang terbuka, seperti Time: 12.3;
  • saat kembali ke Level1, yang memiliki RunClock sendiri, hanya ada satu jam, yaitu jam yang sudah berjalan, dan RunClock.Instance merujuk ke jam tersebut.

Tekan Play, pergi ke Level2 lalu kembali, dan selesaikan Level1 lagi, lalu tekan Check.

Coba sendiri

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"));
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Membangun Game Sungguhan

Latihan sendiri: Playground Unity