Menyimpan progres pemain dalam game Unity

22

Saya membuat game menggunakan mesin game Unity. Saya ingin menyimpan kemajuan pemain termasuk level, poin pengalaman, karakter yang dipilih, dll. Saat ini saya menggunakan playerprefs tetapi saya ingin tahu apakah ini akan bekerja untuk gamer yang akan menjalankan game ini di perangkat mobile mereka (Android / iOS) juga sebagai desktop (OSX / PCs)? Jika tidak, lalu bagaimana saya harus menyimpan informasi ini? Saya ingin menyimpan kemajuan pemain secara otomatis setelah menyelesaikan setiap tahap.

Shantanu Singh
sumber

Jawaban:

30

PlayerPrefs akan bekerja lintas platform, tetapi tidak disarankan untuk kemajuan gameplay, menyimpan file karena tidak aman. Sebagai file plaintext, pemain dapat dengan mudah membukanya dan mengubah konten untuk menipu, atau membuat game Anda berperilaku tak terduga. Ini juga tidak dijamin untuk tetap tinggal.

PlayerPrefs ditujukan untuk informasi preferensi yang tidak penting, seperti pemetaan kontrol atau pengaturan musik / sfx - hal-hal yang dapat diubah pemain dengan bebas, dan tidak akan ketinggalan jika mereka harus (pada Windows misalnya) menggunakan titik pemulihan sistem dan kehilangan beberapa informasi registri mereka. Jika ini kehilangan skor tinggi atau kemajuan kampanye, para pemain akan kecewa!

Sebagai gantinya, disarankan untuk menyimpan progres gameplay dalam file Anda sendiri (biasanya biner, mungkin dienkripsi atau ditandatangani jika Anda ingin membuatnya lebih sulit untuk dimodifikasi, tetapi lihat komentar Philipp di bawah ini tentang ini).

Anda dapat menggunakan Application.persistentDataPath untuk mendapatkan lokasi penyimpanan yang andal di setiap platform. Ini biasanya di folder data pengguna yang tidak akan dihapus dalam kasus seperti contoh di atas.

Setelah Anda memiliki jalur untuk menyimpan, Anda dapat menggunakan metode C # IO biasa untuk membuat, menulis, dan membaca file Anda. Detailnya akan sangat bervariasi tergantung pada format dan struktur penyimpanan file Anda, jadi jika Anda mengalami masalah, yang terbaik adalah mengajukan pertanyaan baru yang merinci apa yang Anda coba lakukan dan di mana Anda terjebak.

DMGregory
sumber
30
Menurut pendapat saya, mengenkripsi dan menandatangani file savegame Anda hanya snakeoil. Itu tidak aman karena Anda harus menyimpan kunci dan algoritme di permainan Anda yang dapat dieksekusi di mana peretas yang terampil dapat mengaksesnya. Ini juga tidak ada gunanya. Saat ini adalah game singleplayer: Mengapa repot? Biarkan pemain menikmati permainan seperti yang mereka inginkan. Saat ini adalah permainan multi-pemain, Anda sebaiknya menyimpan semuanya di server yang aman dari manipulasi.
Philipp
5
@ SamedTarıkÇETİN Ada perbedaan penting antara jalur data (lokasi di mana game Anda dipasang) dan jalur data persisten (lokasi yang dapat diandalkan untuk menyimpan data baru). Pada beberapa platform, game yang dibangun tidak dapat menulis ke jalur data yang diinstal, sehingga menyimpan di lokasi jalur data yang persisten disarankan sebagai aturan umum.
DMGregory
2
Meskipun saya setuju dengan @Philipp bahwa penyimpanan di sisi klien tidak pernah benar-benar aman, dan bahwa dalam banyak kasus kita tidak perlu terlalu berat dalam mengamankan permainan pemain tunggal, jumlah keamanan atau kebingungan untuk diterapkan pada akhirnya adalah pilihan. setiap pencipta harus membuat sendiri. Dengan jawaban ini saya hanya ingin memberi penanya informasi untuk membuat pilihan yang tepat tentang apa yang cocok untuk permainan mereka.
DMGregory
1
Di satu sisi, saya setuju dengan @Philipp tetapi saya juga melihat / bekerja dengan file simpan berseri yang benar-benar tidak terbaca untuk digunakan dalam editor teks. Ya, saya mungkin bisa menemukan cara untuk masuk dan melakukan beberapa perubahan atau yang lain, tetapi karena file tersebut tampak seperti 2 mc dari hexidecimal mentah, itu akan menjadi tugas yang cukup untuk mencari tahu. Dalam kasus seperti itu, hanya orang yang paling tangguh yang akan mencoba membongkar dan hasilnya akan spesifik ke titik itu dalam permainan (menambahkan satu unit lagi ke save mendorong semua data berikutnya di hilir). Dan lagi, itu tidak dimaksudkan untuk aman.
Draco18s
2
@ShantanuSingh dengan tidak menyimpannya di PlayerPrefs. Informasi semacam itu harus disimpan dalam basis data jauh dan diminta pada saat startup aplikasi. Untuk kompatibilitas ketika koneksi internet tidak tersedia, kembali ke file tersimpan aman lokal (yaitu: terenkripsi). Nilai-nilai database, jika tersedia, harus menimpa yang lokal. Mungkin ada plugin pembelian dalam aplikasi yang menangani hal-hal dengan cara lain juga, tetapi itu mungkin akan menjadi "internet wajib", dapat diretas (bahkan file yang dienkripsi tidak 100% aman), atau seperti detail komentar ini.
Draco18s
-1

PlayerPrefs adalah toko K / V yang dirancang untuk "hanya bekerja" tidak peduli apa pun platform yang Anda bangun. Saya katakan terus menggunakannya kecuali Anda memiliki alasan kuat untuk tidak melakukannya.

tanah penggembalaan
sumber
Saya pikir pertanyaannya cukup banyak jika ada alasan kuat untuk tidak menggunakan PlayerPrefs (ya, ada). Karena itu saya menurunkan jawaban ini karena tidak menjawab pertanyaan.
Peter - Unban Robert Harvey
-1

Jadi cara terbaik adalah penghematan sisi server? Konversi semua simpan info yang diperlukan ke json string dan simpan untuk memiliki server mysql sebagai data string dan ketika perlu memuat, sambungkan ke server dan pulihkan?

pencipta
sumber
4
Ini bukan jawaban untuk pertanyaan itu. Jika Anda memiliki pertanyaan, tanyakan sebagai pertanyaan baru .
Sourav Paul