Rumah > Peranti teknologi > industri IT > Menguasai Fungsi Simpan dan Beban dalam Perpaduan 5

Menguasai Fungsi Simpan dan Beban dalam Perpaduan 5

Joseph Gordon-Levitt
Lepaskan: 2025-02-19 09:21:10
asal
391 orang telah melayarinya

Menguasai Fungsi Simpan dan Beban dalam Perpaduan 5

Terima kasih kepada Vincent Quarles untuk membantu rakan -rakan mengkaji artikel ini.

Dalam tutorial ini, kami akan menyelesaikan pelaksanaan fungsi Simpan dan Beban dalam permainan kami. Dalam tutorial sebelumnya mengenai penjimatan dan memuatkan data permainan pemain dalam perpaduan, kami berjaya menyelamatkan dan memuatkan data yang berkaitan dengan pemain seperti statistik dan inventori, tetapi sekarang kami akan menangani bahagian yang paling sukar-objek dunia. Sistem akhir harus mengingatkan permainan Elder Scrolls - setiap objek yang disimpan tepat di mana ia berada, untuk jumlah masa yang tidak terbatas.


Jika anda memerlukan projek untuk berlatih, inilah versi projek yang kami selesaikan dalam tutorial terakhir. Ia telah dinaik taraf dengan sepasang objek interaksasi dalam permainan yang menanam barang-satu ramuan dan satu pedang. Mereka boleh dilahirkan dan

dipilih ( desported ), dan kita perlu menyimpan dan memuatkan keadaan mereka dengan betul. Versi siap projek (dengan sistem simpan sepenuhnya dilaksanakan) boleh didapati di bahagian bawah artikel ini.

Muat turun fail permulaan projek

Projek GitHub Page

Projek Zip Muat turun


Takeaways Key

    Gunakan sistem peristiwa perwakilan untuk memberitahu objek apabila menyelamatkan keadaan mereka, meningkatkan modulariti dan fleksibiliti sistem simpan/beban anda.
  • Melaksanakan objek induk tahap untuk menguruskan pemijahan dan penggabungan objek, memastikan objek dunia mengekalkan keadaan mereka di seluruh sesi permainan.
  • Gunakan kelas berseri untuk menyimpan sifat objek seperti kedudukan, yang boleh diperluas atau diubahsuai dengan mudah untuk pelbagai jenis objek.
  • Pastikan langganan dan langganan yang betul untuk menyimpan peristiwa dalam skrip objek untuk mengelakkan kesilapan dan menguruskan keadaan permainan dengan berkesan.
  • Membangunkan sistem yang mantap untuk menjimatkan dan memuatkan menggunakan pemformatan binari untuk mengendalikan struktur data yang kompleks dan memastikan integriti data.
  • Uji dan memperluaskan sistem untuk memasukkan jenis objek dan fungsi baru, menunjukkan kebolehsuaian dan skalabiliti sistem untuk keperluan pembangunan permainan yang berbeza.
teori pelaksanaan

kita perlu memecahkan sistem penjimatan dan memuatkan objek sebelum kita melaksanakannya. Pertama dan terpenting, kita memerlukan beberapa jenis

Objek Tahap objek yang akan bertelur dan menghina objek. Ia perlu menanam objek yang disimpan di peringkat (jika kita memuatkan tahap dan tidak memulakan lagi), Despawn mengambil objek, memberitahu objek yang mereka perlukan untuk menyelamatkan diri, dan menguruskan senarai objek. Bunyi seperti banyak, jadi mari kita masukkan ke dalam carta aliran:

Pada dasarnya, keseluruhan logik menyimpan senarai objek ke cakera keras - yang, pada masa akan datang tahap dimuatkan, akan dilalui, dan semua objek daripadanya menghasilkan ketika kita mula bermain. Kedengarannya mudah, tetapi syaitan berada dalam butiran: bagaimana kita tahu objek mana yang hendak disimpan dan bagaimana kita menanamnya kembali?

Delegasi dan peristiwa

Dalam artikel sebelumnya, saya nyatakan kami akan menggunakan sistem perwakilan-peristiwa untuk memberitahu objek yang mereka perlukan untuk menyelamatkan diri. Mari kita terlebih dahulu jelaskan apa perwakilan dan peristiwa.

Anda boleh membaca dokumentasi perwakilan rasmi dan dokumentasi acara rasmi. Tetapi jangan risau: walaupun saya tidak faham banyak Technobabble dalam dokumentasi rasmi, jadi saya akan meletakkannya dalam bahasa Inggeris biasa:

Delegate

Anda boleh memikirkan perwakilan sebagai pelan fungsi fungsi. Ia menerangkan apa fungsi yang sepatutnya kelihatan: apakah jenis pulangannya dan apa argumen yang diterima. Contohnya:

public delegate void SaveDelegate(object sender, EventArgs args);
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Delegasi ini menerangkan fungsi yang mengembalikan apa -apa (tidak sah) dan menerima dua argumen standard untuk rangka kerja .NET/MONO: Objek generik yang mewakili pengirim acara, dan argumen akhirnya yang boleh anda gunakan untuk lulus pelbagai data. Anda tidak perlu bimbang tentang ini, kita hanya boleh lulus (null, null) sebagai hujah, tetapi mereka perlu berada di sana.

Jadi bagaimana ikatan ini dengan peristiwa?

peristiwa

Anda boleh memikirkan peristiwa sebagai kotak fungsi

. Ia hanya menerima fungsi yang sepadan dengan perwakilan (cetak biru), dan anda boleh meletakkan dan mengeluarkan fungsi daripadanya semasa runtime namun anda mahu.

Kemudian, pada bila -bila masa, anda boleh mencetuskan peristiwa, yang bermaksud menjalankan semua fungsi yang sedang dalam kotak - sekaligus. Pertimbangkan perisytiharan peristiwa berikut:

public event SaveDelegate SaveEvent;
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Syntax ini berkata: Mengisytiharkan acara awam (sesiapa sahaja boleh melanggannya - kami akan sampai pada masa itu), yang menerima fungsi seperti yang diterangkan oleh Savedelegate Delegate (lihat di atas), dan ia dipanggil SaveEvent.

melanggan dan berhenti berlangganan

Melanggan peristiwa pada dasarnya bermaksud 'meletakkan fungsi dalam kotak'. Sintaks agak mudah. Mari kita anggap acara kami diisytiharkan dalam kelas GlobalObject yang terkenal dan kami mempunyai beberapa kelas objek ramuan bernama

Potondroppable yang perlu melanggan peristiwa:

//In PotionDroppable's Start or Awake function:
GlobalObject.Instance.SaveEvent += SaveFunction;

//In PotionDroppable's OnDestroy() function:
GlobalObject.Instance.SaveEvent -= SaveFunction;

//[...]
public void SaveFunction (object sender, EventArgs args)
{
 //Here is code that saves this instance of an object.
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
mari kita jelaskan sintaks di sini. Kita perlu mempunyai fungsi yang mematuhi piawaian perwakilan yang diterangkan. Dalam skrip objek, terdapat fungsi sedemikian bernama SaveFunction. Kami akan menulis sendiri kemudian, tetapi buat masa ini mari kita anggap bahawa ia adalah fungsi kerja untuk menyimpan objek ke cakera keras supaya ia dapat dimuatkan kemudian.

Apabila kita memilikinya, kita hanya meletakkan fungsi itu di dalam kotak pada permulaan atau terjaga skrip dan mengeluarkannya apabila ia dimusnahkan. (Berhenti melanggan adalah sangat penting: jika anda cuba memanggil fungsi objek yang dimusnahkan, anda akan mendapat pengecualian rujukan null pada masa runtime). Kami melakukan ini dengan mengakses objek acara yang diisytiharkan, dan menggunakan pengendali tambahan diikuti dengan nama fungsi.

Nota: Kami tidak memanggil fungsi menggunakan kurungan atau argumen; Kami hanya menggunakan nama fungsi, tidak ada yang lain.

jadi mari kita jelaskan apa yang akhirnya dilakukan dalam beberapa contoh aliran permainan.

aliran logik

Mari kita anggap bahawa, melalui aliran permainan, tindakan pemain telah menghasilkan dua pedang dan dua ramuan di dunia (contohnya, pemain membuka dada dengan rampasan).

Empat objek ini mendaftarkan fungsi mereka dalam acara SAVE:

Menguasai Fungsi Simpan dan Beban dalam Perpaduan 5 Sekarang mari kita anggap pemain mengambil satu pedang dan satu ramuan dari dunia. Memandangkan objek 'diambil', mereka berkesan mencetuskan perubahan dalam inventori pemain dan kemudian memusnahkan diri mereka (jenis runtuhan sihir, saya tahu):

Dan kemudian, anggap pemain memutuskan untuk menyelamatkan permainan - mungkin mereka benar -benar perlu menjawab telefon yang berbunyi tiga kali sekarang (hei, anda membuat permainan yang hebat): Menguasai Fungsi Simpan dan Beban dalam Perpaduan 5

Pada dasarnya, apa yang berlaku adalah fungsi dalam kotak yang dicetuskan satu demi satu, dan permainan tidak akan pergi ke mana -mana sehingga semua fungsi dilakukan. Setiap objek yang 'menyelamatkan dirinya sendiri' pada dasarnya menulis sendiri dalam senarai - yang, pada beban permainan berikutnya, akan diperiksa oleh objek induk tahap dan semua objek yang ada dalam senarai akan dimasukkan (spavasi). Itu sahaja, benar -benar: jika anda telah mengikuti artikel setakat ini, anda pada dasarnya bersedia untuk mula melaksanakannya dengan segera. Walau bagaimanapun, kami akan pergi ke beberapa contoh kod konkrit di sini, dan seperti biasa, akan ada projek siap yang menunggu anda di akhir artikel jika anda ingin melihat bagaimana semuanya sepatutnya kelihatan.

Menguasai Fungsi Simpan dan Beban dalam Perpaduan 5 kod

mari kita mula -mula pergi ke projek sedia ada dan membiasakan diri dengan apa yang ada di dalamnya.

Seperti yang anda lihat, kami mempunyai kotak -kotak yang direka dengan indah yang bertindak sebagai spawners untuk kedua -dua objek yang telah kami sebutkan. Terdapat pasangan dalam setiap dua adegan. Anda boleh melihat masalahnya dengan segera: Jika anda beralih ke tempat kejadian atau gunakan

F5/F9

untuk menyimpan/memuatkan, objek yang ditanam akan hilang. Menguasai Fungsi Simpan dan Beban dalam Perpaduan 5

Kotak spawners dan objek yang dilahirkan sendiri menggunakan mekanik antara muka yang mudah diinterakkan yang memberikan kita keupayaan untuk mengenali raycast kepada objek tersebut, menulis teks pada skrin, dan berinteraksi dengan mereka menggunakan kekunci [e].

tidak banyak lagi yang ada. Tugas kami di sini adalah:

  • Buat senarai objek ramuan
  • Buat senarai objek pedang
  • Melaksanakan acara Simpan Global
  • melanggan acara menggunakan fungsi penjimatan
  • melaksanakan objek induk tahap
  • Buat tahap induk bertelur semua objek yang disimpan jika kita memuatkan permainan.

seperti yang anda lihat, ini tidak betul -betul seperti yang remeh kerana seseorang mungkin berharap fungsi asas seperti itu. Malah, tiada enjin permainan yang ada di luar sana (CryEngine, UDK, Unreal Engine 4, yang lain) benar -benar mempunyai pelaksanaan fungsi Simpan/Beban yang mudah untuk pergi. Ini kerana, seperti yang anda bayangkan, simpan mekanik benar -benar spesifik untuk setiap permainan. Terdapat lebih banyak lagi kelas objek yang biasanya memerlukan penjimatan; Ia adalah negara -negara dunia seperti pencarian yang lengkap/aktif, keramahan/permusuhan puak, walaupun keadaan cuaca semasa dalam beberapa permainan. Ia menjadi agak rumit, tetapi dengan asas yang tepat dari mekanik penjimatan, ia mudah untuk hanya menaik tarafnya dengan lebih banyak fungsi.

Senarai Kelas Objek

mari kita mulakan dengan perkara mudah terlebih dahulu - senarai objek. Data pemain kami disimpan dan dimuatkan melalui perwakilan mudah data dalam kelas Serializable.

Menguasai Fungsi Simpan dan Beban dalam Perpaduan 5

Dalam fesyen yang sama, kita memerlukan beberapa kelas bersiri yang akan mewakili objek kita. Untuk menulisnya, kita perlu tahu sifat mana yang perlu kita simpan - untuk pemain kita kita mempunyai banyak perkara untuk disimpan. Nasib baik, untuk objek, anda jarang memerlukan lebih banyak daripada kedudukan dunia mereka. Dalam contoh kita, kita hanya perlu menyelamatkan kedudukan objek dan tidak ada yang lain.

untuk menyusun kod kami dengan baik, kami akan bermula dengan kelas mudah pada akhir serializable kami:

public delegate void SaveDelegate(object sender, EventArgs args);
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Anda mungkin tertanya -tanya mengapa kami tidak hanya menggunakan kelas asas. Jawapannya ialah kita boleh, tetapi anda tidak pernah tahu bila anda perlu menambah atau menukar sifat item tertentu yang memerlukan penjimatan. Dan selain itu, ini jauh lebih mudah untuk kebolehbacaan kod.

Sekarang, anda mungkin perasan saya menggunakan istilah

droppable banyak. Ini kerana kita perlu membezakan antara objek droppable (boleh ditanam), dan objek yang boleh diletakkan, yang mengikuti peraturan penjimatan dan pemijahan yang berlainan. Kami akan sampai ke sana kemudian.

Sekarang, tidak seperti data pemain di mana kita tahu ada hanya satu pemain pada bila -bila masa, kita boleh mempunyai pelbagai objek seperti ramuan. Kita perlu membuat senarai dinamik, dan menunjukkan adegan mana yang dimiliki oleh senarai ini: kita tidak boleh menanam objek Level2 di Level1. Ini mudah dilakukan, sekali lagi dalam serializables. Tulis ini di bawah kelas terakhir kami:

public delegate void SaveDelegate(object sender, EventArgs args);
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Tempat terbaik untuk membuat contoh senarai ini akan menjadi kelas GlobalControl kami:

public event SaveDelegate SaveEvent;
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

senarai kami cukup baik untuk pergi sekarang: kami akan mengaksesnya dari objek levelmaster kemudian apabila kami perlu menanam barang, dan menyimpan/beban dari cakera keras dari dalam GlobalControl, seperti yang telah kami lakukan dengan data pemain .

Delegasi dan Acara

ah, akhirnya. Mari kita melaksanakan perkara acara yang terkenal.

dalam GlobalControl:

//In PotionDroppable's Start or Awake function:
GlobalObject.Instance.SaveEvent += SaveFunction;

//In PotionDroppable's OnDestroy() function:
GlobalObject.Instance.SaveEvent -= SaveFunction;

//[...]
public void SaveFunction (object sender, EventArgs args)
{
 //Here is code that saves this instance of an object.
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

seperti yang anda lihat, kami membuat acara rujukan statik, jadi lebih logik dan lebih mudah untuk bekerja dengan kemudian.

Satu nota akhir mengenai pelaksanaan acara: Hanya kelas yang mengandungi perisytiharan peristiwa boleh membakar peristiwa. Sesiapa sahaja boleh melanggannya dengan mengakses GlobalControl.SaveEvent = ..., tetapi hanya kelas GlobalControl yang boleh membakarnya menggunakan SaveEvent (null, null);. Cuba menggunakan GlobalControl.SaveEvent (null, null); Dari tempat lain akan mengakibatkan ralat pengkompil!

Dan itu sahaja untuk pelaksanaan acara! Mari kita langgan beberapa perkara untuk itu!

Langganan Acara

Sekarang bahawa kita mempunyai acara kita, objek kita perlu melanggannya, atau, dengan kata lain, mula mendengar ke acara dan bertindak balas apabila ia api.

kita memerlukan fungsi yang akan dijalankan apabila kebakaran peristiwa - untuk setiap objek. Mari kita pergi ke skrip Potondropplable dalam folder pickups . Nota: Pedang tidak mempunyai skripnya lagi; Kami akan membuatnya seketika!

di potondropplable, tambahkan ini:

[Serializable]
public class SavedDroppablePotion
{
    public float PositionX, PositionY, PositionZ;
}

[Serializable]
public class SavedDroppableSword
{
    public float PositionX, PositionY, PositionZ;
}
Salin selepas log masuk
Salin selepas log masuk
Kami betul -betul melanggan dan berhenti melanggan acara. Sekarang persoalannya tetap, bagaimana untuk menyelamatkan objek ini dalam senarai, betul -betul? Kami perlu pastikan kami mempunyai senarai objek yang diasaskan untuk adegan semasa. Dalam GlobalControl.CS:
[Serializable]
public class SavedDroppableList
{
    public int SceneID;
    public List<SavedDroppablePotion> SavedPotions;
    public List<SavedDroppableSword> SavedSword;

    public SavedDroppableList(int newSceneID)
    {
        this.SceneID = newSceneID;
        this.SavedPotions = new List<SavedDroppablePotion>();
        this.SavedSword = new List<SavedDroppableSword>();
    }
}
Salin selepas log masuk
Fungsi ini perlu dipecat sekali setiap peringkat. Masalahnya, GlobalControl kami membawa melalui tahap dan fungsi permulaan dan terjaga hanya api sekali. Kami akan mendapatkannya dengan hanya memanggil fungsi ini dari objek induk tahap kami yang akan kami buat dalam seketika. Kami akan memerlukan fungsi pembantu kecil untuk mengembalikan senarai adegan aktif semasa juga. Dalam GlobalControl.CS:
    public List<SavedDroppableList> SavedLists = new List<SavedDroppableList>();
Salin selepas log masuk
Sekarang kami pasti kami sentiasa mempunyai senarai untuk menyimpan item kami. Mari kembali ke skrip ramuan kami:
    public delegate void SaveDelegate(object sender, EventArgs args);
    public static event SaveDelegate SaveEvent;
Salin selepas log masuk

Ini adalah di mana semua salutan gula sintaksis kami benar -benar bersinar. Ini sangat mudah dibaca, mudah difahami dan mudah diubah untuk keperluan anda sendiri apabila anda memerlukannya! Singkatnya, kami membuat perwakilan 'ramuan' baru, dan menyimpannya dalam senarai sebenar.

Membuat objek induk tahap

Pertama, sedikit penyediaan. Di dalam projek kami yang sedia ada, kami mempunyai pemboleh ubah global yang memberitahu kami jika tempat kejadian dimuatkan. Tetapi kita tidak mempunyai pemboleh ubah sedemikian untuk memberitahu kita jika adegan sedang peralihan dengan menggunakan pintu. Kami mengharapkan semua objek yang jatuh untuk masih berada di sana ketika kami kembali ke bilik sebelumnya, walaupun kami tidak menyimpan/memuatkan permainan kami di mana saja di antara.

untuk berbuat demikian, kita perlu membuat perubahan kecil kepada kawalan global:

public delegate void SaveDelegate(object sender, EventArgs args);
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

dalam TransitionScript:

public event SaveDelegate SaveEvent;
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Kami bersedia untuk membuat objek levelmaster yang akan berfungsi secara normal.

Sekarang kita hanya perlu membaca senarai dan menanam objek dari mereka apabila kita memuatkan permainan. Inilah yang akan dilakukan oleh Objek Tahap Tahap. Mari buat skrip baru dan panggilnya levelmaster :

//In PotionDroppable's Start or Awake function:
GlobalObject.Instance.SaveEvent += SaveFunction;

//In PotionDroppable's OnDestroy() function:
GlobalObject.Instance.SaveEvent -= SaveFunction;

//[...]
public void SaveFunction (object sender, EventArgs args)
{
 //Here is code that saves this instance of an object.
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

itu banyak kod, jadi mari kita pecahkan.

Kod berjalan hanya pada permulaan, yang kami gunakan untuk memulakan senarai yang disimpan dalam GlobalControl jika diperlukan. Kemudian, kami meminta GlobalControl jika kami memuatkan atau memindahkan adegan. Sekiranya kita memulakan adegan baru (seperti permainan baru atau sebagainya), tidak penting - kita tidak menelan objek.

Jika kita memuatkan adegan, kita perlu mengambil salinan tempatan kita senarai objek yang disimpan (hanya untuk menjimatkan sedikit prestasi pada mengakses GlobalControl yang berulang, dan untuk menjadikan sintaks lebih mudah dibaca).

Seterusnya, kami hanya melintasi senarai dan menanam semua objek ramuan di dalamnya. Sintaks yang tepat untuk pemijahan pada dasarnya adalah salah satu daripada kaedah instantiate yang berlebihan. Kita mesti membuang hasil kaedah instantiate ke dalam GameObject (atas sebab tertentu, jenis pulangan lalai adalah objek mudah) supaya kita dapat mengakses transformasi, dan mengubah kedudukannya.

Ini adalah di mana objek itu dilahirkan: Jika anda perlu menukar nilai-nilai lain pada masa bertelur, ini adalah tempat untuk melakukannya.

kita perlu meletakkan tuan tahap kami di setiap tempat kejadian dan menetapkan prefabs yang sah kepadanya:

Menguasai Fungsi Simpan dan Beban dalam Perpaduan 5 Sekarang kita hanya kehilangan satu sekeping penting: kita perlu benar -benar membakar acara itu, bersiri senarai ke cakera keras dan membaca dari mereka. Kami hanya akan melakukannya dalam fungsi simpanan dan beban sedia ada kami dalam GlobalControl:

Ini juga kelihatan banyak kod, tetapi majoriti itu sudah ada. (Jika anda mengikuti tutorial terdahulu saya, anda akan mengenali perintah siriisasi binari; satu -satunya perkara baru di sini ialah fungsi FireSaveEvent, dan satu fail tambahan yang menjimatkan senarai kami.
[Serializable]
public class SavedDroppablePotion
{
    public float PositionX, PositionY, PositionZ;
}

[Serializable]
public class SavedDroppableSword
{
    public float PositionX, PositionY, PositionZ;
}
Salin selepas log masuk
Salin selepas log masuk
Ujian awal

Jika anda menjalankan projek sekarang, objek ramuan akan disimpan dengan betul dan dimuatkan setiap kali anda memukul

f5

dan

f9 , atau berjalan melalui pintu (dan sebarang kombinasi seperti). Walau bagaimanapun, ada satu lagi masalah untuk diselesaikan: kami tidak menyelamatkan pedang.

ini hanya untuk menunjukkan cara menambah objek baru

yang boleh diselamatkan ke projek anda sebaik sahaja anda mempunyai asas yang sama dibina.

memperluaskan sistem

jadi katakan anda sudah mempunyai sistem objek-objek baru di tempat-seperti yang sudah kita lakukan dengan objek pedang. Mereka kini tidak berinteraksi dengan banyak (di luar fizik asas), jadi kita perlu menulis skrip yang serupa dengan ramuan yang membolehkan kita 'mengambil' pedang dan menjadikannya menyimpan dengan betul.

Prefab of the Sword yang kini ditanam boleh didapati dalam folder Aset> Prefabs.

mari kita lakukan. Pergi ke Aset> Skrip> Pickups dan di sana anda akan melihat PoTiondRoppable

skrip. Di sebelahnya, buat skrip Sworddropplable baru:
public delegate void SaveDelegate(object sender, EventArgs args);
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Jangan lupa pelaksanaan antara muka 'Interactable'. Ia sangat penting: tanpa pedang anda tidak akan diiktiraf oleh kamera Raycast dan akan tetap tidak dapat ditarik. Juga, semak semula bahawa prefab pedang tergolong dalam lapisan item. Jika tidak, ia akan sekali lagi diabaikan oleh Raycast. Sekarang tambahkan skrip ini kepada anak pertama Prefab Pedang (yang sebenarnya mempunyai penerima mesh dan komponen lain):

Menguasai Fungsi Simpan dan Beban dalam Perpaduan 5

Sekarang, kita perlu menanamnya. Di peringkat tuan, di bawah kami untuk gelung yang memancarkan ramuan:

public event SaveDelegate SaveEvent;
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

... dan itu sahaja. Bila -bila masa anda memerlukan jenis item baru yang disimpan:

  • tambah kelas serializables
  • Buat skrip untuk item yang melanggan acara
  • Tambahkan logik instantiate dalam tuan tahap.

Kesimpulan

Buat masa ini, sistem ini agak kasar: terdapat banyak fail simpan pada cakera keras, putaran objek tidak disimpan (pedang, pemain, dll), dan logik untuk meletakkan pemain semasa peralihan tempat kejadian (tetapi tidak Memuatkan) agak unik.

Ini adalah masalah kecil sekarang untuk diselesaikan sebaik sahaja sistem pepejal disediakan, dan saya menjemput anda untuk cuba mengikat dengan tutorial ini dan projek selesai untuk melihat sama ada anda dapat memperbaiki sistem.

Tetapi walaupun begitu, ia sudah menjadi kaedah yang boleh dipercayai dan kukuh untuk melakukan mekanik menyimpan/memuatkan dalam permainan anda - namun banyak yang mungkin berbeza dari contoh projek.


Seperti yang dijanjikan, inilah projek siap, sekiranya anda memerlukannya untuk rujukan, atau kerana anda terjebak di suatu tempat. Sistem simpan dilaksanakan mengikut arahan tutorial ini dan dengan skim penamaan yang sama.

Muat turun projek siap:

Projek GitHub Page Muat turun zip projek

Soalan Lazim (Soalan Lazim) Mengenai Menguasai Fungsi Simpan Dan Beban Dalam Perpaduan 5

Apakah cara terbaik untuk melaksanakan sistem simpan dalam Perpaduan 5? PlayerPrefs adalah cara mudah untuk menyimpan dan mengambil data antara sesi permainan. Ia membolehkan anda menyimpan dan memuatkan data dalam bentuk bilangan bulat, terapung, dan rentetan. Walau bagaimanapun, penting untuk diperhatikan bahawa PlayerPrefs tidak selamat dan tidak boleh digunakan untuk data sensitif. Untuk data yang lebih kompleks atau selamat, anda mungkin ingin mempertimbangkan menggunakan formatter binari atau serializer JSON.

Bagaimana saya boleh menyimpan keadaan permainan dan tetapan dalam Perpaduan 5? Dalam Perpaduan 5 boleh dicapai menggunakan pemain PlayerPrefs, Serialization JSON, atau pemformatan binari. PlayerPrefs adalah kaedah yang paling mudah, membolehkan anda menyimpan dan memuatkan bilangan bulat, terapung, dan rentetan. Serialization JSON sedikit lebih kompleks tetapi membolehkan lebih banyak fleksibiliti dan keselamatan. Pemformatan binari adalah kaedah yang paling selamat tetapi juga yang paling kompleks. skrip mana yang dijalankan. Ini boleh memberi kesan yang signifikan kepada fungsi simpanan dan beban. Sebagai contoh, jika skrip yang memuatkan data dilaksanakan sebelum skrip yang menjimatkan data, permainan mungkin memuatkan data ketinggalan zaman. Oleh itu, adalah penting untuk memastikan skrip yang berkaitan dengan penjimatan dan pemuatan data diperintahkan dengan betul dalam perintah pelaksanaan. 5 boleh dicapai dengan menggunakan pemformatan atau penyulitan binari. Pemformatan binari menukar data anda ke dalam format binari yang tidak mudah dibaca. Penyulitan menambah lapisan tambahan keselamatan dengan mengekodkan data anda dengan cara yang hanya boleh dimulakan dengan kunci tertentu. 🎜> Walaupun PlayerPrefs adalah cara yang mudah dan mudah untuk melaksanakan fungsi menyimpan dan memuatkan dalam Perpaduan 5, ia mempunyai beberapa batasan. Pertama, ia hanya menyokong bilangan bulat, terapung, dan rentetan. Kedua, ia tidak selamat dan mudah dimanipulasi. Akhir sekali, PlayerPrefs mempunyai had saiz, yang boleh menjadi masalah untuk permainan dengan sejumlah besar data.

Bagaimana saya boleh menyimpan dan memuatkan struktur data kompleks dalam perpaduan 5? Struktur data kompleks dalam Perpaduan 5 dapat dicapai menggunakan siri JSON atau pemformatan binari. Serialization JSON membolehkan anda menukar struktur data kompleks ke dalam format rentetan yang boleh disimpan dan dimuatkan dengan mudah. Pemformatan binari adalah kaedah yang lebih selamat yang mengubah data anda menjadi format binari.

Bolehkah saya menyimpan dan memuatkan data merentasi platform yang berbeza dalam Perpaduan 5? keserasian silang platform. Sebagai contoh, PlayerPrefs adalah serasi dengan platform, tetapi pemformatan binari mungkin tidak serasi di semua platform. Simpan dan memuatkan fungsi dalam Perpaduan 5 boleh dilakukan dengan memeriksa urutan pelaksanaan skrip anda, memastikan data anda betul bersiri atau diformat, dan menguji anda Permainan di platform yang anda ingin melepaskannya.

Bagaimana saya boleh mengoptimumkan fungsi menyimpan dan memuatkan dalam Perpaduan 5 untuk prestasi yang lebih baik? dicapai dengan meminimumkan jumlah data yang anda simpan dan memuatkan, menggunakan struktur data yang cekap, dan memastikan skrip anda dioptimumkan dengan baik. 5?

Melaksanakan fungsi autosave dalam Perpaduan 5 boleh dilakukan dengan membuat skrip yang secara automatik menjimatkan permainan anda secara tetap atau pada peristiwa tertentu. Skrip ini harus menggunakan kaedah yang sama untuk menyimpan data sebagai sistem simpan manual anda.

Atas ialah kandungan terperinci Menguasai Fungsi Simpan dan Beban dalam Perpaduan 5. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan