Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Game Development
  2. Programming
Gamedevelopment

Buat Asteroid-Like Screen Wrapping Effect Dengan Unity

by
Length:MediumLanguages:

Malay (Melayu) translation by Meyria (you can also view the original English article)

ihat demo di bawah dan mari bermula!

Klik demo untuk memberi tumpuan, kemudian gunakan kekunci anak panah untuk menggerakkan kapal.

Seperti yang anda lihat, terdapat dua cara untuk melakukan ini. Yang pertama lebih mudah untuk membungkus kepala anda. Penyelesaian kedua tidaklah lebih rumit, tetapi memerlukan beberapa pemikiran yang tidak jelas. Kami akan menutup kedua-dua mereka.

Menyediakan Adegan

Mari letakkan tempat kejadian dahulu. Kebakaran Perpaduan, mulakan projek baru, dan tetapkan kedudukan kamera ke x = 0, y = 0 (z boleh apa sahaja yang anda suka). Anda mungkin mahu kamera berada dalam mod ortografi; pembalut skrin kami akan berfungsi dalam mod perspektif, tetapi ia mungkin tidak kelihatan seperti yang anda mahu. Jangan ragu untuk bereksperimen.

Nota editor: Lihat komen Clemens untuk maklumat tentang membuat kerja ini dalam mod perspektif.

Tambah objek yang akan dibungkus dan buatnya bergerak. Anda boleh menggunakan skrip ShipMovementBehaviour dari sumber demo.

Unity Asteroids Wrapping Setup

Dalam kes saya, saya mempunyai kapal angkasa yang mudah (sebuah kon) dengan pergerakan seperti Asteroid. Seperti yang anda dapat lihat dalam gambar, saya lebih suka mempunyai mesh yang dipasangkan pada objek utama. Sama ada anda melakukannya seperti itu atau tidak, sama ada anda mempunyai satu atau beberapa jaring, tidak mengapa; kita akan membuat skrip pembungkusan skrin yang bagus yang berfungsi dalam apa jua keadaan.

Wrapping Mudah

Idea asas di belakang pembalut skrin ialah:

  1. Semak apakah sama bila objek dimatikan.
  2. Ketahui di mana ia keluar dari skrin. Adakah ia pergi ke tepi kiri atau kanan? Atas atau bawah?
  3. Teleport objek itu tepat di belakang tepi yang berlawanan skrin. Contohnya, jika ia melepasi tepi kiri, kami menelefonnya di belakang tepi kanan. Kami menelefon objek di sebalik kelebihan yang bertentangan, supaya ia kelihatan seperti membungkusnya bukannya teleport.

Melakukan Ini dalam Perpaduan

Oleh itu, perkara pertama yang kami mahu lakukan adalah untuk memeriksa sama ada objek itu dimatikan sepenuhnya. Satu cara mudah untuk melakukan ini dalam Perpaduan adalah dengan memeriksa sama ada penyuntik objek kelihatan. Sekiranya mereka tidak, ini bermakna objek itu benar-benar di luar kamera dan dengan itu di luar skrin.

Mari kita ambil penghantar pada Mula () dan buat fungsi utiliti untuk menyemaknya:

Kita kini boleh memberitahu sama ada objek kami dimatikan skrin, tetapi kita masih perlu mengetahui di mana ia pergi, dan kemudian teleport ke pihak yang bertentangan. Untuk melakukan ini, kita dapat melihat kapak secara berasingan. Sebagai contoh, jika kedudukan x kapal kami berada di luar batas skrin, itu bermakna ia pergi sama ada ke kiri atau ke kanan.

Cara paling mudah untuk memeriksa adalah untuk mula menukar posisi dunia kapal ke posisi viewport, dan kemudian melakukan pemeriksaan. Dengan cara ini, ia akan berfungsi sama ada anda menggunakan kamera ortografi atau perspektif.

Untuk membuat perkara lebih jelas, beri saya terangkan koordinat viewport. Ruang paparan adalah relatif kepada kamera. Koordinat berkisar antara 0 hingga 1 untuk semua yang ada di skrin, yang bermaksud:

  • x = 0 ialah koordinat tepi kiri skrin.
  • x = 1 adalah koordinat tepi kanan skrin.

Begitu juga,

  • y = 0 adalah koordinat kelebihan skrin bawah.
  • y = 1 ialah koordinat kelebihan skrin utama.

Ini bermakna, jika sesuatu objek dimatikan, ia akan mempunyai sama ada koordinat negatif (kurang daripada 0), atau koordinat yang lebih besar daripada 1.

Viewport coordinates

Oleh kerana kedudukan cam kami berada pada x = 0, y = 0, adegan diletakkan seperti cermin. Segala-galan ke kanan mempunyai koordinat x positif; segala-galanya ke kiri, negatif. Semuanya di bahagian atas mempunyai koordinat y positif; segala-galanya di bahagian bawah, negatif. Oleh itu, untuk meletakkan objek kami di seberang skrin, kami hanya membalikkan kedudukannya di sepanjang paksi yang sesuai. Sebagai contoh:

  • Jika kapal kami bergerak ke kanan dan kedudukannya adalah (20, 0), ia menjadi (-20, 0).
  • Jika kapal kami bergerak ke tepi bawah dan kedudukannya (0, -15), ia menjadi (0, 15).

Perhatikan bahawa kita mengubah kedudukan transformasi kapal, bukan kedudukan viewportnya.

Wrap illustration

Dalam kod, kelihatan seperti ini:

Jika anda menjalankan projek sekarang, ia akan berfungsi dengan baik pada kebanyakan masa. Tetapi kadang-kadang, objek mungkin tidak membungkus. Ini berlaku kerana objek kami sentiasa menukar posisi semasa di luar skrin, bukan sekadar sekali. Kami boleh menghalangnya dengan menambahkan beberapa pemboleh ubah kawalan:

Segala-galanya perlu berfungsi dengan sempurna sekarang, dan kod pembungkusan skrin akhir harus kelihatan seperti ini:

Wrapping Advanced

Pembalakan mudah berfungsi dengan baik, tetapi ia kelihatan lebih baik. Daripada objek yang keluar dari skrin sebelum membungkus, anda boleh membungkus sempurna, seperti dalam gambar di bawah:

Perfect Wrapping

Cara paling mudah untuk melakukan ini adalah untuk menipu sedikit dan mempunyai beberapa kapal di tempat kejadian. Dengan cara ini, kami akan mencipta ilusi kapal tunggal membungkus sekitar. Kami akan memerlukan lapan kapal tambahan (saya akan memanggil mereka hantu): satu untuk setiap tepi dan satu untuk setiap sudut skrin.

Kami mahu kapal-kapal hantu ini dapat dilihat hanya apabila pemain datang ke tepi. Untuk melakukan itu, kita perlu meletakkannya pada jarak tertentu dari kapal utama:

  • Dua kapal meletakkan lebar skrin jauh ke kiri dan ke kanan.
  • Dua kapal meletakkan ketinggian skrin jauh di atas dan bawah, masing-masing.
  • Empat kapal sudut meletakkan lebar skrin jauh mendatar dan ketinggian skrin jauh menegak.
Wrapping Ghosts

Melakukan Ini dalam Perpaduan

Kita perlu mengambil saiz skrin terlebih dahulu, supaya kita dapat meletakkan kapal hantu kita. Perkara itu, kita memerlukan saiz skrin dalam koordinat dunia berbanding dengan kapal pemain. Itu tidak benar-benar penting jika kita menggunakan kamera ortografi, tetapi dengan pandangan perspektif ia adalah sangat penting untuk kapal-kapal hantu berada pada koordinat z yang sama sebagai kapal utama.

Jadi, untuk melakukan ini dengan cara menangkap, kita akan mengubah koordinat viewport sudut skrin atas dan kanan ke kiri ke koordinat dunia yang terletak pada paksi z yang sama sebagai kapal utama. Kami kemudian menggunakan koordinat ini untuk mengira lebar dan ketinggian skrin dalam unit dunia berbanding dengan kedudukan kapal kami.

Isytiharkan skrinWidth dan screenHeight sebagai pembolehubah kelas dan tambahkan ini ke Start ():

Sekarang kita dapat meletakkannya dengan betul, mari kita menanam kapal hantu. Kami akan menggunakan pelbagai untuk menyimpannya:

Dan mari kita buat fungsi yang akan melakukan pemijahan. Saya akan mengklon kapal utama untuk membuat hantu, dan kemudian saya akan mengeluarkan ScreenWrapBehaviour daripada mereka. Kapal utama adalah satu-satunya yang perlu mempunyai ScreenWrapBehaviour, kerana ia boleh mengawal hantu dan kami tidak mahu hantu untuk meninjaukan hantu mereka sendiri. Anda juga boleh mempunyai prefab berasingan untuk kapal hantu dan menyatakannya; ini adalah cara untuk pergi jika anda mahu hantu mempunyai beberapa kelakuan khas.

Kami kemudian meletakkan hantu seperti dalam imej di atas:

Jalankan projek anda dan cuba. Sekiranya anda melihat paparan pemandangan, anda akan melihat bahawa semua kapal hantu bergerak dengan kapal utama dan bertukar apabila ia berubah. Kami tidak jelas kod ini, tetapi masih berfungsi. Adakah anda mempunyai idea mengapa?

Kapal hantu adalah klon kapal utama tanpa ScreenWrappingBehaviour. Mereka masih harus mempunyai tingkah laku pergerakan yang berasingan dan kerana mereka semua menerima input yang sama, mereka semuanya bergerak sama. Sekiranya anda ingin menanam hantu dari sebuah prefab, jangan lupa memasukkan komponen pergerakan, atau skrip lain yang akan menyegerakkan pergerakan mereka dengan kapal utama.

Semuanya seolah-olah bekerja dengan baik sekarang, kan? Nah, hampir. Sekiranya anda terus ke satu arah, kali pertama ia akan berfungsi dengan baik, tetapi apabila anda mencapai tepi lagi, tidak akan ada kapal di sisi lain. Menjadi rasa, kerana kita tidak melakukan apa-apa teleporting kali ini. Mari selesaikannya.

Sebaik sahaja kapal utama melepaskan tepi, kapal hantu akan berada di skrin. Kita perlu menukar posisi mereka dan kemudian meletakkan semula kapal hantu di sekitar kapal utama. Kami sudah menyimpan pelbagai hantu, kita hanya perlu menentukan yang mana satu di skrin. Kemudian kami melakukan pertukaran dan penyusunan semula. Dalam kod:

Cuba sekarang, dan semuanya perlu berfungsi dengan sempurna.

Pemikiran Akhir

Anda kini mempunyai komponen pembalut skrin kerja. Sama ada ini cukup untuk anda bergantung kepada permainan yang anda buat dan apa yang anda cuba capai.

Pembalut sederhana cukup mudah untuk digunakan: hanya pasangkannya ke objek dan anda tidak perlu bimbang tentang kelakuannya. Sebaliknya, anda perlu sedikit berhati-hati jika anda menggunakan pembalut lanjutan. Bayangkan situasi di mana peluru, atau asteroid memukul kapal hantu: anda perlu menyebarkan peristiwa perlanggaran ke kapal utama, atau objek pengawal luaran.

Anda juga mungkin mahu objek permainan anda membungkus hanya satu paksi. Kami sudah melakukan pemeriksaan berasingan untuk setiap paksi, jadi itu hanya masalah menambah beberapa Booleans kepada kod.

Satu perkara yang lebih menarik untuk dipertimbangkan: bagaimana jika anda mahu kamera bergerak agak dan bukannya diperbetulkan di angkasa? Mungkin anda mahu mempunyai arena yang lebih besar daripada skrin. Dalam hal ini, anda masih dapat menggunakan skrip pembungkus yang sama. Anda hanya memerlukan tingkah laku berasingan yang mengawal pergerakan kamera. Oleh kerana kod kami didasarkan pada kedudukan viewport, kedudukan dalam permainan kamera tidak begitu penting.

Anda mungkin mempunyai beberapa idea anda sendiri sekarang. Jadi teruskan, cubalah mereka dan buat beberapa permainan!

Rujukan

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.