Bagaimana cara membuat karakter yang mampu berjalan di dinding?

34

Saya mencoba membuat karakter bergerak seperti laba-laba: Mengingat kemiringan naik yang biasanya tidak bisa digulung oleh bola, laba-laba itu perlahan-lahan akan merangkak naik.

Demikian pula, diberi platform persegi panjang di udara, alih-alih jatuh ke bawah ketika mencapai tepi, laba-laba akan terus, membungkus tepi dan terus ke bawah sisi dan kemudian di bawah platform (akhirnya berjalan di sekeliling platform).

Saya telah melihat ke berbagai komponen Unity 2D, dengan sedikit keberhasilan. :(

Sebagian besar batas tabrakan duniaku ditandai oleh komponen Collider 2D (yang bekerja sangat baik dengan bola sederhana yang dipengaruhi oleh gravitasi, tetapi kurang begitu dengan karakter laba-laba ini).

pyko
sumber
1
Game itu: youtube.com/watch?v=ga4Zqq1tXa8 ("Spider" di PS1, saya telah memainkannya sejak lama) mungkin bisa menjadi sumber inspirasi.
tigrou

Jawaban:

43

Saya akan memposting tautan ke blog Pangkalan Asteroid di musuh Walker ketika saya perhatikan karmington sudah terhubung dengan artikel Gamasutra dalam komentar.

Mungkin ada baiknya memberikan ini lebih banyak visibilitas dan penjelasan sebagai jawaban dalam dirinya sendiri sekalipun.

Aku mau makan rayshine, o-oh!

Caranya adalah raycast . Ini memungkinkan kode Anda memindai sepanjang garis untuk tabrakan.

Untuk membuat Walker sejajar dengan permukaan, mereka menembakkan dua sinar ke bawah di medan, satu dari sisi kiri Walker dan satu dari kanan (garis merah dan kuning di atas).

Dari setiap objek RaycastHit2D, Anda bisa mendapatkan vektor normal yang mengarah tegak lurus ke permukaan (garis magenta dan hijau). Dengan rata-rata normals dari dua hit, Anda mendapatkan orientasi yang sesuai untuk karakter Anda yang cukup mencerminkan medan yang mendasarinya (garis cyan).

Anda dapat menerapkan gaya ke bawah di sepanjang garis orientasi ini untuk menjaga karakter menempel pada medan (meskipun ini dapat menyebabkan beberapa geser jika gesekan rendah), atau secara manual posisikan karakter pada titik persimpangan sinar rata-rata seperti yang dilakukan dengan Walker.

Anda harus memadukan orientasi karakter secara bertahap agar karakter Anda tidak bergetar atau terlihat seperti robot (lihat bagaimana normal berubah dengan tajam ketika Walker melintasi sudut, tetapi tubuh bergerak dengan lancar).

Jika Anda memiliki sudut tajam di medan Anda, Anda mungkin ingin memiringkan sinar ini sedikit ke dalam - sehingga jika laba-laba berjalan melewati tepi tebing 90 derajat, sinar yang menggantung akan mengenai wajah tebing.

Tim Pangkalan Asteroid juga menembakkan sinar pendek ke arah gerakan Walker (tidak ditampilkan), yang menimpa sinar di sisi itu jika mengenai medan. Itu memastikan alat bantu jalan tidak macet saat berjalan ke sudut cekung 90 derajat.

Menurut dokumen, raycast 2D berbeda dari 3D di mana mendeteksi pendobrak di mana ray dimulai. Itu kedengarannya mencurigakan bagi saya, tetapi jika pengujian Anda mengonfirmasi ini, Anda ingin menggunakan layerMask untuk membatasi sinar hanya mendeteksi collider medan yang bisa dipanjat.

DMGregory
sumber
Saya dapat mengonfirmasi bahwa raycast 2D akan mendeteksi colliders yang berisi titik awal raycast. Ini dapat dengan mudah disaring, karena deteksi pertama selalu dikembalikan dengan jarak 0 dan kebalikan dari arah raycast.
XenoRo
2

Anda akan memerlukan kode khusus untuk ini.

Pada dasarnya Anda perlu tahu apa objek terdekat, seperti platform yang dimaksud, dan kemudian menemukan tepi terdekat, dan titik terdekat di tepi itu, lalu menentukan posisi laba-laba dan rotasi dari sana.

Itu tidak akan mudah untuk membuatnya benar-benar menyenangkan, tetapi itu harus menjadi tantangan yang baik untuk membuatnya bekerja sama sekali.

karmington
sumber
2
Berikut ini tautan yang sangat bagus, tidak yakin apakah itu cocok untuk kasus Anda, tapi mungkin mungkin ... gamasutra.com/blogs/AdamWinkels/20140220/211306/…
karmington