Flash Sale! Up to 40% off on unlimited courses, tutorials and creative asset downloads Up to 40% off on unlimited assets SAVE NOW
Advertisement
  1. Game Development
  2. Programming
Gamedevelopment

Panggand Dungeons 3D Milik Anada Dengan Resipi Prosedur

by
Difficulty:IntermediateLength:MediumLanguages:

Malay (Melayu) translation by Adjatay Bashroh Aldad (you can also view the original English article)

Dalam tutorial ini, anda akan belajar cara membina penjara bawah tanah kompleks dari bahagian pasang siap, tanpa had kepada grid 2D atau 3D. Pemain anda tidak akan kehabisan penjara bawah tanah untuk meneroka, artis anda akan menghargai kebebasan kreatif, dan permainan anda akan mempunyai replayability yang lebih baik.

Untuk mendapat manfaat daripada tutorial ini, anda perlu memahami transformasi 3D asas dan berasa selesa dengan graf adegan dan sistem komponen entiti.

Sedikit Sejarah

Salah satu permainan yang paling awal untuk menggunakan generasi dunia prosedur adalah Rogue. Dibuat pada tahun 1980, ia dipaparkan secara dinamik, 2D, penjara bawah tanah berasaskan grid. Terima kasih kerana tidak ada dua playthroughs yang sama, dan permainan ini telah menghasilkan genre permainan yang baru, yang dipanggil ''roguelikes''. Jenis penjara bawah tanah ini masih agak biasa selama 30 tahun kemudian.

Pada tahun 1996, Daggerfall dibebaskan. Ia menampilkan ruang bawah tanah 3D prosedur dan bandar-bandar, yang membolehkan pemaju untuk membuat beribu-ribu lokasi unik, tanpa perlu membina mereka secara manual. Walaupun pendekatan 3D menawarkan banyak kelebihan terhadap penjara bawah tanah grid 2D, ia tidak begitu biasa.

This image shows a part of a larger dungeon, extracted to illustrate what modules have been used to build it. The image has been generated in "Daggerfall Modelling", downloaded from www.dfworkshop.net
Imej ini menunjukkan sebahagian daripada penjara yang lebih besar, diekstrak untuk menggambarkan modul apa yang telah digunakan untuk membinanya. Imej dihasilkan dengan 'Daggerfall Modeling', dimuat turun dari dfworkshop.net.

Kami akan memberi tumpuan kepada menjana penjara bawah tanah yang serupa dengan Daggerfall.

Bagaimana Membina Dungeon?

Untuk membina sebuah penjara bawah tanah, kita perlu menentukan apa penjara bawah tanah. Dalam tutorial ini, kita akan menentukan penjara bawah tanah sebagai satu set modul (model 3D) bersambung satu sama lain mengikut satu set peraturan. Kami akan menggunakan bilik yang dihubungkan dengan koridor dan persimpangan:

  • Bilik adalah kawasan besar yang mempunyai satu atau lebih pintu keluar
  • Koridor adalah kawasan yang sempit dan panjang yang boleh dilonggarkan, dan mempunyai dua pintu keluar
  • Persimpangan adalah kawasan kecil yang mempunyai tiga atau lebih pintu keluar

Dalam tutorial ini, kami akan menggunakan model mudah untuk modul—jejak mereka hanya akan mengandungi lantai. Kami akan menggunakan tiga daripada masing-masing: bilik, koridor dan persimpangan. Kami akan memvisualisasikan penanda keluar sebagai objek paksi, dengan paksi -X /+ X menjadi merah, paksi +Y berwarna hijau, dan paksi +Z berwarna biru.

Modules used to build a dungeon
Modul digunakan untuk membina penjara bawah tanah

Perhatikan bahawa orientasi keluar tidak dikekang untuk kenaikan 90 derajat.

Apabila menyambungkan modul, kami akan mentakrifkan peraturan berikut:

  • Bilik-bilik boleh menyambung ke koridor
  • Koridor boleh bersambung ke bilik atau persimpangan
  • Persimpangan boleh menyambung ke koridor

Setiap modul mengandungi satu set objek penanda keluar —dengan kedudukan dan putaran yang diketahui. Setiap modul ditandakan untuk menyatakan jenisnya, dan setiap keluar mempunyai senarai teg yang boleh disambungkan ke.

Di peringkat tertinggi, proses membina penjara bawah tanah adalah seperti berikut:

  1. Menyediakan modul permulaan (sebaiknya satu dengan jumlah keluar yang lebih besar).
  2. Menyedia dan menyambungkan modul yang sah untuk setiap keluar modul yang tidak disambungkan.
  3. Membina semula senarai keluar yang tidak disambungkan di penjara bawah tanah setakat ini.
  4. Ulangi proses sehingga penjara yang cukup besar dibina.
A look at the iterations of the algorithm at work
Lihat pada lelaran algoritma di tempat kerja.

Proses terperinci untuk menyambung dua modul bersama adalah:

  1. Pilih keluar yang tidak berkaitan dari modul lama.
  2. Pilih prefab modul baru dengan tag yang hampir sama tag yang dibenarkan oleh keluar modul lama.
  3. Menyampaikan modul baru.
  4. Pilih jalan keluar dari modul baru.
  5. Sambungkan modul: padankan keluar modul baru untuk yang lama.
  6. Tandakan kedua-dua keluar sebagai bersambung, atau hapuskannya dari graf adegan.
  7. Ulang untuk bahagian luar modul lama yang tidak berkaitan.

Untuk menyambungkan dua modul bersama-sama, kita perlu menyelaraskannya (berputar dan menterjemahkannya dalam ruang 3D), supaya keluar dari modul pertama sepadan dengan keluar dari modul kedua. Keluar adalah sepadan apabila kedudukan mereka sama dan paksi +Z mereka bertentangan, sementara paksi +Y mereka sepadan.

Algoritma untuk melakukan ini adalah mudah:

  1. Putar modul baru pada paksi +Y dengan giliran asal pada kedudukan keluar baru, supaya paksi keluar +Z yang lama bertentangan dengan paksi +Z keluar baru, dan paksi +Y mereka sama.
  2. Terjemah modul baru supaya kedudukan keluar baru sama dengan kedudukan keluar lama.
Connecting two modules
Menyambung dua modul.

Pelaksanaan

Kod pseudo adalah Python-ish, tetapi ia harus dibaca oleh sesiapa sahaja. Kod sumber sampel adalah projek Perpaduan.

Mari kita anggap kita bekerja dengan sistem komponen entiti yang memegang entiti dalam graf adegan, menentukan hubungan ibu bapa dan anak mereka. Satu contoh yang baik dari enjin permainan dengan sistem sedemikian adalah Perpaduan, dengan objek permainan dan komponennya. Modul dan keluar adalah entiti; keluar adalah anak modul. Modul mempunyai komponen yang mentakrifkan tag mereka, dan keluar mempunyai komponen yang mentakrifkan tag yang dibenarkan untuk disambungkan.

Kami akan berurusan dengan algoritma generasi penjara pertama. Kekangan akhir yang akan kita gunakan adalah beberapa lelaran langkah-langkah penjanaan penjara.

Fungsi instantiate() mewujudkan contoh modul modul: ia membuat salinan modul, bersama dengan keluarnya, dan meletakkannya di tempat kejadian. Fungsi get_random_with_tag() melelepkan melalui semua prefabs modul, dan memilih satu secara rawak, ditandakan dengan tag yang disediakan. The Rawak.choice() fungsi mendapat elemen rawak dari senarai atau array diluluskan sebagai parameter.

Fungsi match_exits adalah di mana semua keajaiban berlaku, dan ditunjukkan secara terperinci di bawah:

Properti backward_vector dari exit adalah vektor -Z. Fungsi rotate_around_y() memainkan objek di sekeliling paksi +Y dengan pivotnya pada titik yang disediakan, dengan sudut tertentu. The translate_global() function translates the object with its children in the global (scene) space, regardless of any child relationship it may a part of. The vector_angle() function returns an angle between two arbitrary vectors, and finally, the math.copysign() berfungsi menyalin tanda nombor yang disediakan: -1 untuk nombor negatif, 0 untuk sifar, dan +1 untuk nombor positif.

Memperluas Penjana

Algoritma ini boleh digunakan untuk jenis generasi dunia yang lain, bukan hanya penjara bawah tanah. Kita boleh memperluaskan definisi modul untuk meliputi bukan sahaja bahagian penjara seperti bilik, koridor dan persimpangan, tetapi juga perabot, peti harta karun, hiasan bilik, dll. Dengan meletakkan penanda keluar di tengah-tengah bilik, atau di dinding bilik, dan menandakannya sebagai rampasan, hiasan, atau raksasa, kita boleh membawa penjara ke hidupan, dengan objek yang boleh mencuri, mengagumi atau membunuh.

Hanya ada satu perubahan yang perlu dilakukan, supaya algoritma berfungsi dengan betul: salah satu penanda yang hadir dalam item yang boleh dipakai harus ditandakan sebagai lalai, supaya ia selalu dipilih sebagai yang akan diselaraskan dengan adegan yang ada.

1 room, 2 chests, 3 pillars, 1 altar, 2 lights, and 2 items have been created and tagged. A room holds a set of markers that reference other models' tags, such as "chest", "pillar", "altar", "wallLight". An altar has three "item" markers on it. By applying the dungeon generation technique to a single room, we can create numerous of its variations.

Dalam imej di atas, satu bilik, dua dada, tiga tiang, satu mezbah, dua lampu, dan dua item telah dibuat dan ditandakan. Bilik memegang satu set penanda yang merujuk kepada tag model lain, seperti dada, tiang, mezbah, atau dinding. Mezbah mempunyai tiga penanda item di atasnya. Dengan menggunakan teknik penjanaan penjara ke bilik tunggal, kita boleh membuat pelbagai variasi.

Algoritma yang sama boleh digunakan untuk membuat item prosedur. Jika anda ingin membuat pedang, anda boleh menentukan cengkamannya sebagai modul permulaan. Cengkaman akan disambungkan ke pommel dan ke penjaga silang. Pengawal silang akan menyambung ke pisau. Dengan hanya tiga versi setiap bahagian pedang, anda boleh menghasilkan 81 pedang unik.

Kaunter

Anda mungkin perasan beberapa masalah dengan cara algoritma ini berfungsi.

Masalah pertama adalah bahawa versi paling mudah membina penjara sebagai pokok modul, dengan akarnya menjadi modul permulaan. Jika anda mengikuti mana-mana cawangan struktur penjara bawah tanah, anda dijamin akan memukul mati. Di sana cawangan pokok tidak saling terhubung, dan penjara bawah tanah akan kekurangan geladak bilik atau koridor. Salah satu cara untuk menangani masalah ini ialah mengetepikan beberapa modul keluar untuk pemprosesan kemudian, dan tidak menyambung modul baru untuk keluar ini. Sebaik sahaja penjana pergi melalui lelaran yang mencukupi, ia akan memilih sepasang pintu keluar secara rawak, dan akan cuba menghubungkannya dengan satu set koridor. Terdapat sedikit kerja algoritma yang perlu dilakukan, untuk mencari satu set modul dan satu cara untuk menghubungkannya dengan cara yang akan mewujudkan jalan yang boleh dilalui antara pintu keluar ini. Masalah ini sendiri cukup rumit untuk mendapatkan artikel yang berasingan.

Satu lagi masalah adalah bahawa algoritma tidak menyedari ciri ruang modul yang ia letakkan; ia hanya tahu keluar keluar tag, dan orientasi dan lokasi mereka. Ini menyebabkan modul menjadi tumpang tindih. Penambahan cek perlanggaran sederhana antara modul baru yang akan ditempatkan di sekitar modul sedia ada akan membolehkan algoritma membina penjara bawah tanah yang tidak mengalami masalah ini. Apabila modul bertembung, ia boleh membuang modul yang ia cuba letakkan dan akan cuba yang lain.

The simplest implementation of the algorithm with no collision checks causes modules to overlap.
Pelaksanaan algoritma yang paling mudah tanpa pemeriksaan perlanggaran menyebabkan modul menjadi bertindih.

Mengurus keluar dan tag mereka adalah masalah lain. Algoritma ini menyarankan untuk menentukan tag pada setiap contoh keluar, dan menandakan semua bilik-tetapi ini banyak kerja penyelenggaraan, jika terdapat cara lain untuk menghubungkan modul-modul yang anda ingin cuba. Sebagai contoh, jika anda ingin membenarkan bilik menyambung ke koridor dan persimpangan bukan hanya koridor, anda perlu melalui semua keluar dalam semua modul bilik dan mengemas kini tag mereka. Cara mengelilingi ini adalah untuk menentukan peraturan sambungan di tiga tahap berasingan: penjara, modul dan keluar. Tahap penjara akan menentukan peraturan untuk seluruh penjara-ia akan menentukan tag yang dibenarkan untuk sambungkan. Beberapa bilik akan dapat mengatasi peraturan sambungan, apabila diproses. Anda boleh mempunyai bilik ''bos'' yang akan menjamin bahawa sentiasa ada ruang ''harta'' di belakangnya. Keluar keluar tertentu akan mengatasi dua tahap terdahulu. Menetapkan tag setiap keluar membolehkan fleksibiliti yang paling besar, tetapi kadang-kadang terlalu banyak kelenturan tidak begitu baik.

Matematik titik terapung tidak sempurna, dan algoritma ini banyak bergantung padanya. Semua perubahan putaran, orientasi keluar dan kedudukan kedudukan sewenang-wenangnya akan ditambah, dan boleh menyebabkan artifak sebagai lipit atau tumpang tindih di mana keluarnya terhubung, terutamanya dari pusat dunia. Sekiranya ini terlalu ketara, anda boleh memperluaskan algoritma ini untuk meletakkan penambahan tambahan di mana modul bertemu, seperti bingkai pintu atau ambang. Artis mesra anda pasti akan mencari cara untuk menyembunyikan ketidaksempurnaan. Untuk penjara bawah tanah yang bersesuaian (lebih kecil daripada 10,000 unit di seluruh), masalah ini tidak dapat dilihat, dengan mengambil perhatian yang mencukupi apabila meletakkan dan memutarkan penanda keluar modul.

Kesimpulan

Algoritma ini, walaupun beberapa kekurangannya, menawarkan cara yang berbeza untuk melihat generasi penjara. Anda tidak lagi dikekang untuk bertukar 90 darjah dan bilik segi empat. Artis anda akan menghargai kebebasan kreatif pendekatan ini akan ditawarkan, dan pemain anda akan menikmati rasa yang lebih alami daripada penjara bawah tanah.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.