Kami menghasilkan tingkat ubin dan menyembunyikan kotak dari pemain


Level Generation di Unexplored 2


Kami sangat bangga dengan generator level permainan Unexplored 2, ini adalah program yang memenuhi semua persyaratan modern. Dalam sebuah posting saya akan berbicara tentang bagaimana level game dibuat.

Kami tidak harus menemukan kembali roda. Di Unexplored 1, kami telah menciptakan teknik yang sangat memengaruhi keberhasilan gim pertama. Unexplored 2 melanjutkan apa yang dimulai. Fondasi teknologi kami terdiri dari dua bagian: kami menggunakan generasi multi-tahap, yang hampir menyerupai proses yang sangat mirip dengan karya desainer tingkat hidup. Selain itu, kami menggunakan teknik yang disebut " cyclic dungeon generation ", yang jauh lebih baik dalam menghasilkan level yang terlihat alami daripada kebanyakan aplikasi pembuatan konten generatif standar. Dalam posting ini saya akan berbicara tentang aspek pertama. Mengadaptasi generasi ruang bawah tanah siklik ke Unexplored 2 akan menjadi topik tulisan di masa mendatang.

Imitasi desain tingkat "manusia"


Generator level memecah proses pembangkitan level menjadi seluruh rangkaian tahapan terkontrol. Mulai dari perencanaan tingkat tinggi ke peta tingkat terperinci tingkat rendah. Bahkan, ia pertama kali membuat sketsa level, dan kemudian mulai menambahkan detail sampai level selesai dan diisi.

Pada setiap tahap individu dari proses ini, kami menggunakan tata bahasa generatif untuk mengubah level yang dihasilkan pada tahap sebelumnya. Secara khusus, kami menggunakan tata bahasa ubin dan tata bahasa grafik, yang merupakan varietas tata bahasa string yang lebih umum yang hanya mencari dan mengganti bagian-bagian string dengan string lain, seperti halnya ekspresi reguler. Jika Anda tidak terbiasa dengan konsep tata bahasa generatif dan ekspresi reguler, maka saya sarankan Anda mencari contoh di Internet (atau hanya melanjutkan membaca - Anda tidak perlu pengetahuan mendalam untuk memahami arti dari posting ini).

Tahap pertama dari level ini relatif sederhana. Kami menggunakan bitmap resolusi rendah untuk menemukan dasar-dasar level. Pada contoh di bawah ini, level awalnya sangat sederhana: hanya terdiri dari pintu masuk (e) di sebelah kiri, pintu masuk di kanan dan menghubungkan jalur langsung. Sebagian besar ubin lain tidak terdefinisi (u) atau diblokir (B) karena berada di tepi level.


Gambar 1: Sketsa sederhana level

Pada tahap berikutnya, rincian ditambahkan: sekelompok kamar muncul, dihubungkan oleh gerbang, yang dirancang untuk melewati arah tertentu:


Gambar 2: Menambahkan Struktur

Peta ubin sangat bagus untuk membuat geometri level, tetapi lebih praktis untuk bekerja dengan grafik untuk menghasilkan struktur dan logika gameplay. Inilah yang generator lakukan selanjutnya:


Gambar 3: Grafik Dasar

Dalam grafik, beberapa node berisi subnodes, dalam kasus kami sebagian besar gerbang ditandai sebagai berbahaya (H), dan beberapa ditandai sebagai terbuka (O).

Berdasarkan analisis yang cukup sederhana dan aturan generatif, elemen baru ditambahkan ke grafik. Misalnya, titik akhir (G) terletak di lokasi yang cukup jauh dari pintu masuk. Selain itu, bahaya kecil ditambahkan ke grafik untuk membuat level lebih mengancam.


Gambar 4: Item baru ditambahkan ke grafik.

Sementara itu, peta ubin resolusi rendah dikonversi menggunakan beberapa fungsi gangguan menjadi peta ubin resolusi tinggi untuk memberikan tampilan yang lebih alami:


Gambar 5: Peta Tile Resolusi Tinggi

Kemudian informasi dari grafik digunakan untuk menghias peta ubin dan menambahkan elemen baru:


Gambar 6: Kartu genteng berdekorasi.

Peta seperti ini dibuat semata-mata untuk presentasi dalam gameplay. Ubin putih menunjukkan ruang terbuka, dan hampir semua ubin lainnya menunjukkan elemen gameplay yang sangat spesifik, misalnya, jalan rahasia melalui semak-semak (lingkaran hijau), "gerbang di semak-semak" (kotak hijau dan garis-garis lilac) atau tempat bertelur untuk mengikat pohon (lingkaran merah dengan huruf s). Bagian utama dari level ini masih belum ditentukan, dan pada tahap ini generator mengasumsikan bahwa area ini harus diisi untuk memblokir pergerakan pemain.

Dia melakukan tugas ini pada beberapa lapisan: lapisan bawah menunjukkan tingkat ketinggian dan jenis permukaan, yang kedua menambahkan air di lokasi tertentu, dan lapisan ketiga menambahkan vegetasi dan dekorasi lainnya.


Gambar 7: Jenis permukaan bumi (rumput, lumpur, dan batu)


Gambar 8: Air


Gambar 9: Vegetasi dan dekorasi lainnya

Lapisan-lapisan ini kemudian ditambahkan ke file data tingkat akhir, yang ditambahkan beberapa rincian lebih lanjut. Gim ini menggunakan data ini untuk menempatkan aset dan membangun level seperti yang Anda lihat. Ada banyak trik pada tahap ini. Misalnya, Anda mungkin memperhatikan bahwa ubin tanah pada gambar di atas memiliki bentuk aneh. Bentuk-bentuk ini digunakan untuk membuat tanah "ubin" sedemikian rupa sehingga pemain tidak melihat bahwa data sumber adalah peta ubin. Saya akan membicarakan ini di bagian kedua artikel.


Gambar 10: Level Siap

Menambahkan Gameplay


Ada banyak manfaat untuk metode pembuatan level ini. Tahap mengubah level menjadi grafik sangat penting untuk menyederhanakan "penalaran" tentang gameplay ke generator. Dalam contoh yang ditunjukkan di atas, kami tidak melakukan apa pun kecuali untuk memverifikasi bahwa target level dibuat agak jauh dari input. Tetapi untuk level lain pada tahap ini lebih banyak tugas yang dilakukan.

Ambil contoh peta gua dengan gaya penjara bawah tanah yang lebih klasik (dibandingkan dengan tingkat hutan dari contoh di atas). Grafik dasar tingkat ini hanya memiliki satu pintu masuk dan beberapa tipe gerbang baru. Sepasangnya tertutup (L): beberapa gerbang menjebak pemain dari satu sisi (T), dan hijau tua saya sebut β€œkatup”: jenis gerbang ini memungkinkan pemain hanya masuk satu arah.


Gambar 11: Jumlah Pangkalan Gua

Struktur level ini memungkinkan generator untuk membuat misi yang jauh lebih kompleks. Misalnya, satu-satunya cara untuk mencapai level ini adalah melalui "katup", memaksa pemain untuk mencari jalan keluar lain. Kunci untuk membuka jalan keluar (kiri bawah) terletak di belakang bahaya di kiri atas, dan target terletak di belakang gerbang yang menjebak pemain. Contoh tujuan seperti itu adalah bagian yang runtuh di belakang pemain. Secara umum, ini menciptakan gua yang menarik untuk dijelajahi sendiri, tetapi Unexplored 2 juga memiliki kemampuan untuk menambahkan makhluk dan acara yang berbaur saat dijalankan.


Gambar 12: Kunci dan kunci ditambahkan ke gua

Dengan menggunakan proses yang dijelaskan di atas, grafik digunakan untuk menghasilkan dan mengisi peta ubin yang sangat rinci. Penerapan berbagai parameter yang mencerminkan sifat gua tingkat ini mengarah ke hasil yang sangat beragam dengan struktur bawah tanah yang hancur (kotak biru yang ditandai dengan huruf c) dan jurang yang lebar dengan paku (lingkaran ungu):


Gambar 13: Level Gua dalam Detail Lengkap

Untuk meringkas


Saya harap Anda mendapat ide umum tentang bagaimana kita mendekati generasi level di Unexplored 2. Ini adalah proses multi-tahap yang kompleks, yang saya rencanakan untuk dituliskan lebih lanjut dalam waktu dekat. Setidaknya saya sudah berjanji kepada Anda untuk menulis tentang penerapan generasi penjara bawah tanah siklik. Tetapi Anda dapat menceritakan lebih banyak lagi, dari teknik bercerita generatif, render garis, dan metode naungan hingga proses desain panjang yang kami gunakan untuk menciptakan sistem keberuntungan, serta aspek lainnya.

Bagian 2. Dari ubin ke kurva, atau bersenang-senang dengan jumlah Voronoi



Generator konten 2 yang belum dijelajahi menghasilkan peta ubin. Hasil khas terlihat seperti ini:


Kartu ubin ini ditumpuk satu sama lain dan menggunakan ubin yang berbeda untuk menunjukkan jenis permukaan bumi (dalam contoh ini rumput atau kotoran), serta berbagai dekorasi. Dalam hal ini, ada beberapa semak (lingkaran hijau besar), batu (lingkaran hitam), tanaman (lingkaran hijau kecil), bunga (lingkaran putih) dan tekstur dekoratif (kotak abu-abu). Ada juga ubin khusus yang menunjukkan data gameplay, misalnya, spawn point yang ditandai dengan huruf "s". Selain itu, ubin dapat ditandai dengan informasi tambahan, misalnya, level tinggi atau subtipe khusus.

Peta ubin adalah struktur data yang nyaman untuk generator. Tetapi pada saat yang sama, itu cukup mudah, dan grid sering terlihat dalam permainan. Namun, setelah memuat data ke dalam game dan menempatkan aset, hasilnya terlihat seperti ini:


Saya pikir kami menyembunyikan ubin dengan cukup baik, dan itulah cara kami mendapatkannya.

Voronoi Magic


Kuncinya adalah bahwa ubin individu sesuai dengan sel dalam diagram Voronoi. Diagram ini dapat digunakan untuk menghasilkan bentuk yang jauh lebih alami. Diagram Voronoi dibuat dengan menabur bidang dengan titik acak dan membaginya menjadi sel sedemikian rupa sehingga setiap titik pada bidang tersebut milik sel yang sesuai dengan titik awal terdekat. Dalam pembuatan konten prosedural, diagram Voronoi dapat digunakan dalam beberapa cara menarik.

Diagram Voronoi yang khas dibuat dari distribusi acak, tetapi cukup merata dari titik-titik pembangkit, yang terlihat seperti ini:


Di Unexplored 2 kami menggunakan jenis distribusi yang berbeda untuk menghasilkan poin. Pertama, kami menghasilkan satu poin untuk setiap ubin. Jadi kita dapat yakin bahwa setiap ubin pada peta ubin akan sesuai dengan satu sel dalam diagram Voronoi.

Jika kita menempatkan titik penghasil di tengah setiap sel, kita mendapatkan garis lurus yang terlihat persis seperti peta ubin (untuk ini dan gambar lain di bawah ini, saya membuat versi catur di mana setengah dari ubin diberikan kuning sehingga Anda dapat melakukan sedikit lebih baik lihat pola):



Cara termudah adalah memperbaiki grafik dengan hanya mengacak posisi setiap titik pembangkit. Saat memindahkan poin, perlu diperiksa bahwa titik tersebut tidak melampaui ubin asli.

Hasilnya terlihat seperti ini:



Sudah lebih baik, tetapi sangat bising, dan dengan demikian tidak mendapatkan garis-garis berliku yang indah. Gambar dapat ditingkatkan dengan melakukan "relaksasi" diagram Voronoi (ini adalah teknik standar untuk mereka, yang tidak akan saya bahas di sini). Tapi itu akan selalu tetap sedikit bising, dan sulit untuk secara efektif memprediksi angka pada skala yang melebihi skala ubin individu.

Untuk mengatasi masalah ini, kita tidak hanya perlu bergerak secara acak, tetapi untuk mendekati yang lebih pintar ini. Berbagai jenis gerakan dapat memiliki efek yang sangat berbeda. Misalnya, saat menggunakan suara Perlin, kartu ubin melengkung yang menarik diperoleh. Atau Anda dapat mengubah seluruh grid menjadi ubin heksagonal hanya dengan memindahkan setiap baris kedua dari titik-titik penghasil ke kiri:



Kami membuat terobosan nyata ketika kami mulai memindahkan titik pembangkit dalam pola tertentu untuk membuat sudut membulat. Tahap pertama dari proses ini sudah dilakukan di dalam generator level. Sudut antara berbagai jenis permukaan bumi dikenali, dan ubin sudut ditandai dengan angka yang berbeda, menunjukkan cara mereka berubah bentuk untuk menghasilkan lingkungan yang lebih indah:


Dalam hal ini, perbedaan tingkat ketinggian juga menyebabkan sudut muncul di peta ubin. Itulah mengapa Anda melihat sudut bulat tambahan di rumput di kanan atas dan kiri bawah, di mana lereng dihasilkan.

Permainan menggunakan informasi ini untuk menggeser titik penghasil grafik Voronoi. Setiap sudut bundar menggeser lokasi titik asal (lihat gambar di bawah). Selain itu, ia juga menggeser titik penghasil dari empat tetangganya yang ortogonal. Proses ini bersifat kumulatif; menghasilkan poin dapat bergerak beberapa kali jika mereka dekat beberapa sudut. Namun, setelah memproses semua offset, titik-titik pembangkitnya sedikit acak (sekitar 10% dari lebar ubin di setiap arah), dan offset akhir dibatasi hingga maksimum 40% dari lebar ubin.


Hasilnya sudah mendapatkan kualitas yang cukup tinggi:



Tapi kami belum selesai ...

Hiasi dengan bijak


Bentuk keseluruhan menjadi lebih baik, tetapi ujung-ujungnya masih sangat lurus dan terlihat agak bergerigi. Kami akan menyembunyikan ini dengan menempatkan aset melengkung di tepi yang warnanya berbeda. Namun, trik sebenarnya adalah bahwa satu kurva sering ditempatkan pada dua sisi, dan sudutnya relatif satu sama lain digunakan untuk menentukan arah kurva.


Hasilnya terlihat seperti ini:


Selanjutnya, kami menggunakan aset 3D untuk menambahkan kliping tekstur:


Akhirnya, kami menambahkan aset lain untuk mengisi level. Lokasi aset ini ditentukan oleh data level yang dihasilkan sebelumnya, dan secara umum mengikuti prinsip-prinsip sederhana. Kami menggunakan aset kecil di sekitar yang lebih besar untuk menciptakan transisi alami dan indah. Secara khusus, perlu dicatat bahwa batu ditambahkan di kaki tebing, menciptakan variabilitas dan secara visual melunakkan lereng vertikal yang diperlukan untuk permainan:


Variabilitas lokal


Sudut bukan satu-satunya jenis perpindahan yang kami gunakan. Secara khusus, kami ingin bagian tepinya lebih lurus di sebelah struktur buatan (misalnya, dinding yang hancur ditunjukkan di bawah):


Dalam sistem kami, efek ini mudah dicapai. Kami hanya menambahkan aturan perpindahan lain, yang melarang perpindahan ubin dengan struktur buatan manusia. Generator menggunakan kotak kecil untuk menandai ubin seperti itu, dan permainan memastikan bahwa semua offset hanya diabaikan:



Jika Anda melihat tanah, Anda dapat dengan jelas melihat bahwa area tertentu dibuat lurus, sementara yang lain menekuk lebih alami:


Bukankah ini indah?

Ada aturan lain yang dapat dengan mudah ditambahkan menggunakan teknik ini. Misalnya, terkadang kami memaksa ubin untuk membuat pola heksagonal sehingga jalur sempit tetap cukup lebar untuk bergerak di sekitarnya. Saya yakin kita akan menemukan kegunaan lain untuk pola lain.

Ini adalah salah satu dari banyak alasan mengapa saya suka diagram Voronoi. Lain waktu, saya akan menulis tentang bagaimana kita menggunakannya untuk menghasilkan dan menghias peta dunia Unexplored 2.

Source: https://habr.com/ru/post/id457766/


All Articles