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.
Tantangan
MudahJam 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
ClockTextpada level yang sedang terbuka, sepertiTime: 12.3; - saat kembali ke Level1, yang memiliki RunClock sendiri, hanya ada satu jam, yaitu jam yang sudah berjalan, dan
RunClock.Instancemerujuk 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"));
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Membangun Game Sungguhan
4Scene dan Level
Muat SceneMulai Ulang LevelLevel BerikutnyaPertahankan Antar-SceneRekap: Pilih Level10Proyek: Platformer 3D
LintasanPlatform Bergerak2Tombol dan Layar
Tombol dan onClickLambdaMenghubungkan di InspectorPanel Aktif dan NonaktifBilah KesehatanRangkuman: Toko Upgrade5Menyimpan dengan PlayerPrefs
Simpan AngkaMuat dengan Nilai DefaultSkor TertinggiSimpan PengaturanUlasan: Koin di BankLatihan sendiri: Playground Unity