Saya sedang mengembangkan game 2D pertama saya di Unity dan saya telah menemukan apa yang tampaknya merupakan pertanyaan penting.
Bagaimana cara saya menangani data di antara adegan?
Tampaknya ada jawaban yang berbeda untuk ini:
Seseorang menyebutkan menggunakan PlayerPrefs , sementara orang lain mengatakan kepada saya ini harus digunakan untuk menyimpan hal-hal lain seperti kecerahan layar dan sebagainya.
Seseorang mengatakan kepada saya bahwa cara terbaik adalah memastikan untuk menulis semuanya menjadi savegame setiap kali saya mengubah adegan, dan untuk memastikan bahwa ketika adegan baru dimuat, dapatkan info dari savegame lagi. Bagi saya ini tampak boros dalam kinerja. Apakah saya salah?
Solusi lain, yang telah saya terapkan sejauh ini adalah memiliki objek permainan global yang tidak dihancurkan di antara adegan, menangani semua data di antara adegan. Jadi saat permainan dimulai, saya memuat adegan mulai di mana objek ini dimuat. Setelah ini berakhir, ini memuat adegan permainan nyata pertama, biasanya menu utama.
Ini implementasi saya:
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public class GameController : MonoBehaviour {
// Make global
public static GameController Instance {
get;
set;
}
void Awake () {
DontDestroyOnLoad (transform.gameObject);
Instance = this;
}
void Start() {
//Load first game scene (probably main menu)
Application.LoadLevel(2);
}
// Data persisted between scenes
public int exp = 0;
public int armor = 0;
public int weapon = 0;
//...
}
Objek ini dapat ditangani di kelas saya yang lain seperti ini:
private GameController gameController = GameController.Instance;
Meskipun ini telah bekerja sejauh ini, itu memberi saya satu masalah besar: Jika saya ingin memuat adegan secara langsung, katakanlah misalnya tingkat akhir permainan, saya tidak dapat memuatnya secara langsung, karena adegan itu tidak mengandung ini objek game global .
Apakah saya menangani masalah ini dengan cara yang salah? Adakah praktik yang lebih baik untuk tantangan semacam ini? Saya ingin mendengar pendapat, pemikiran, dan saran Anda tentang masalah ini.
Terima kasih
Cara ideal untuk menyimpan variabel antar adegan adalah melalui kelas manajer tunggal. Dengan membuat kelas untuk menyimpan data yang persisten, dan mengatur kelas itu untuk
DoNotDestroyOnLoad()
, Anda dapat memastikan itu segera diakses dan bertahan di antara adegan.Opsi lain yang Anda miliki adalah menggunakan
PlayerPrefs
kelas.PlayerPrefs
dirancang untuk memungkinkan Anda menyimpan data di antara sesi bermain , tetapi tetap berfungsi sebagai sarana untuk menyimpan data di antara adegan .Menggunakan kelas singleton dan
DoNotDestroyOnLoad()
Script berikut menciptakan kelas singleton persisten. Kelas singleton adalah kelas yang dirancang untuk hanya menjalankan satu instance pada saat yang sama. Dengan menyediakan fungsionalitas seperti itu, kita dapat dengan aman membuat referensi mandiri statis, untuk mengakses kelas dari mana saja. Ini berarti Anda dapat langsung mengakses kelas
DataManager.instance
, termasuk variabel publik apa pun di dalam kelas.Anda dapat melihat singleton beraksi, di bawah ini. Perhatikan bahwa segera setelah saya menjalankan adegan awal, objek DataManager bergerak dari heading khusus adegan ke heading "DontDestroyOnLoad", pada tampilan hierarki.
Menggunakan
PlayerPrefs
kelasUnity memiliki built in class untuk mengelola data persisten dasar yang dipanggil
PlayerPrefs
. Setiap data yang dikomit kePlayerPrefs
file akan bertahan di seluruh sesi permainan , jadi tentu saja, itu mampu bertahan data di seluruh adegan.The
PlayerPrefs
File dapat menyimpan variabel jenisstring
,int
danfloat
. Ketika kami memasukkan nilai ke dalamPlayerPrefs
file, kami memberikan tambahanstring
sebagai kunci. Kami menggunakan kunci yang sama untuk kemudian mengambil nilai kami dariPlayerPref
file.Perhatikan bahwa saya mengambil tindakan pencegahan tambahan, saat menangani
PlayerPrefs
file:private static string
. Ini memungkinkan saya untuk menjamin bahwa saya selalu menggunakan kunci yang benar, dan itu berarti bahwa jika saya harus mengubah kunci untuk alasan apa pun, saya tidak perlu memastikan saya mengubah semua referensi untuk itu.PlayerPrefs
file ke disk setelah menulis ke sana. Ini mungkin tidak akan membuat perbedaan, jika Anda tidak menerapkan kegigihan data di seluruh sesi bermain.PlayerPrefs
akan menyimpan ke disk saat aplikasi normal ditutup, tetapi mungkin tidak secara otomatis memanggil jika game Anda crash.PlayerPrefs
, sebelum saya mencoba untuk mengambil nilai yang terkait dengannya. Ini mungkin tampak seperti mengecek tidak ada gunanya, tetapi ini adalah praktik yang baik untuk dilakukan.Delete
metode yang segera menghapusPlayerPrefs
file. Jika Anda tidak ingin memasukkan data yang persisten di seluruh sesi permainan, Anda dapat mempertimbangkan untuk memanggil metode iniAwake
. Dengan membersihkanPlayerPrefs
file pada awal setiap pertandingan, Anda memastikan bahwa setiap data yang tidak bertahan dari sesi sebelumnya tidak keliru ditangani sebagai data dari saat sesi.Anda dapat melihat
PlayerPrefs
aksi, di bawah. Perhatikan bahwa ketika saya mengklik "Simpan Data", saya langsung memanggilSave
metode, dan ketika saya mengklik "Muat Data", saya langsung memanggilLoad
metode. Implementasi Anda sendiri kemungkinan akan bervariasi, tetapi ini menunjukkan dasar-dasarnya.Sebagai catatan terakhir, saya harus menunjukkan bahwa Anda dapat memperluas dasar
PlayerPrefs
, untuk menyimpan jenis yang lebih berguna. JPTheK9 memberikan jawaban yang baik untuk pertanyaan serupa , di mana mereka menyediakan skrip untuk membuat serial array ke dalam bentuk string, untuk disimpan dalamPlayerPrefs
file. Mereka juga mengarahkan kami ke Unify Community Wiki , di mana pengguna telah mengunggahPlayerPrefsX
skrip yang lebih luas untuk memungkinkan dukungan untuk berbagai jenis yang lebih besar, seperti vektor dan array.sumber