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

Bagaimana Meningkatkan Masalah Fizik Umum dalam Permainan Anda

by
Length:MediumLanguages:

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

Banyak permainan menggunakan enjin fizik untuk memandu cara bergerak dan bertindak balas. Menggunakan enjin fizik boleh menambahkan rendaman, permen mata, dan yang terbaik dari semua, permainan muncul, tetapi juga boleh, jika digunakan secara salah, membawa kepada keputusan yang tidak realistik atau masalah memecahkan masalah. Dalam jawatan ini, saya akan menerangkan bagaimana untuk mengenal pasti dan membetulkan masalah biasa yang dilihat dalam permainan hari ini.

Kami akan mengkaji dan menyelesaikan masalah seperti yang dilihat dalam Perpaduan, yang memberi tumpuan kepada enjin fizik 3D terbina dalam Nvidia PhysX, tetapi prinsip teras boleh digunakan untuk mana-mana platform dan fizik enjin yang lain.

Nota: Anda boleh mencari pelbagai jenis model 3D untuk memulakan anda di Pasar Envato.

Demo

Demo ini menunjukkan kebanyakan kesilapan yang disebut dalam artikel ini dalam keadaan yang salah atau patah, dan dalam keadaan tetap:

Skala Normal

Ini adalah adegan yang mudah dengan bola yang masuk ke dalam timbunan tong. Skala Salah(10x) skor alternatif  menunjukkan bagaimana pemandangan berubah pada skala 10x (lihat tanda skala di lantai demo). Perhatikan bagaimana ia muncul dalam gerak perlahan, tetapi kesan ini hanya disebabkan oleh skala tempat kejadian.

Pengawal Watak

Ini menunjukkan permainan sisi mudah scroller yang berfungsi seperti yang diharapkan. Alternatif "buruk"; Rigidbody & Pengawal Watak Bersama menunjukkan permainan yang sama, tetapi dengan komponen Rigidbody yang melekat pada karakter. Perhatikan bagaimana Rigidbody memecah tingkah laku Pengawal Watak.

Objek Dengan Bounciness

Tong ditembak dari sisi tempat kejadian dan dilempar ke udara. Ketika mereka jatuh, mereka bangkit dari tanah dan bergerak dengan cara sederhana namun megah. Versi yang patah menunjukkan adegan yang sama tanpa pemantauan, dan ia kelihatan jauh lebih membosankan berbanding.

Bukan Secara Langsung Mengubah Transformasi Rigidbody

Dalam senario ini, bola berat ditolak dengan jalan menggunakan Rigidbody.AddForce(). Dalam senario kedua, bukan menggunakan Rigidbody.AddForce() untuk menggerakkan bola ke jalan, Transform.position digunakan. Hasil daripada menggunakan Transform.position adalah bahawa bola menggulung kembali, disebabkan fakta bahawa orang tegar itu tidak mengambil kira perubahan halaju orang yang tegar, tetapi pengubahsuaian kedudukan menyebabkan bola menjuntai naik dan turun jalan.

Kesalahan Biasa

Skala Tidak Betul

Dalam kebanyakan permainan, pemain akan mengandaikan bahawa skala dunia boleh dikaitkan dengan skala Bumi. Mereka menjangkakan, sebagai contoh, musuh jatuh dari menara tontonan untuk jatuh pada kadar yang sama yang anda akan lihat di Bumi. Sekiranya musuh jatuh terlalu perlahan atau terlalu cepat, ia dapat mengurangkan penyerapan - terutama jika musuh bersaiz manusia!

Nvidia PhysX dalam Perpaduan ditubuhkan untuk menggunakan satu unit per meter. Anda boleh menggunakan ciri ini untuk memeriksa sama ada skala objek anda betul dengan hanya menambah dalam kiub primitif Perpaduan. Kubus primitif adalah betul-betul satu meter padu. Jika anda perhatikan, sebagai contoh, bahawa tong minyak di tempat kejadian anda adalah 2x lebih besar daripada kiub, ini bermakna tong minyak anda adalah dua meter tinggi (6.56 kaki)!

Memperbaiki skala adalah semudah mencengkam setiap objek di tempat kejadian. Hanya pilih semua objek di tempat kejadian anda dan gunakan alat Skala untuk menjadikannya lebih besar atau lebih kecil. Jika anda perasan objek anda bergerak terlalu cepat, membuat objek lebih besar. Jika anda perhatikan yang bertentangan-bahawa objek bergerak terlalu lambat-anda perlu mengukur objek ke bawah.

Anda boleh membuat skala objek anda dengan lebih ketepatan dengan mengelompokkannya ke satu objek null, dan mengukur objek itu. Sebagai contoh, menetapkan skala objek induk kepada 1.2 pada setiap paksi akan meningkatkan saiz setiap objek dalam objek sebanyak 20%. Anda juga boleh meningkatkan objek dalam penambahan menggunakan alat skala dengan menekan Ctrl-LMB (Windows) atau Cmd-LMB (OS X).

Menggunakan Persatuan Rigidbody dan Pengawal Watak Bersama

Saya telah melihat ini berlaku beberapa kali, dan sebenarnya masuk akal seberapa kerap berlaku ini. Pemaju mengandaikan bahawa Pengawal Watak diperlukan untuk mengawal avatar mereka, tetapi mereka mahu avatar dipengaruhi oleh graviti dan objek lain dalam alam sekitar.

Masalahnya ialah Pengawal Watak direka bentuk untuk kawalan lebih klasik, seperti yang biasanya terdapat dalam platformer atau penembak orang pertama. Rigidbody adalah hanya objek yang tidak ubah bentuk yang dipengaruhi oleh graviti dan daya fizikal lain (seperti objek lain bertabrakan dengannya). Ini adalah dua komponen yang sangat berasingan, dengan kegunaan yang berbeza.

Hanya pilih Pengawal Watak apabila anda ingin melengkapkan kawalan bagaimana pemain bergerak. Sebaliknya, jika anda mahukan watak anda digerakkan oleh enjin fizik, gunakan orang tegar. Dalam menambah seorang Rigidbody kepada watak, anda mungkin mahu mengekang putaran supaya pemain tidak terjatuh.

Secara langsung Mengubah Transformasi Rigidbody

Tidak seperti Pengawal Watak, amalan tidak baik untuk menetapkan kedudukan atau putaran orang tegar, atau skala objek tegar sentiasa (untuk kawalan pemain dan sebagainya). Sebaliknya, anda harus menggunakan kaedah AddForce() dan AddTorque() yang terdapat dalam kelas Rigidbody. Adalah baik untuk secara langsung menetapkan kedudukan dan putaran seorang Rigidbody jika, sebagai contoh, anda membelanja dalam objek untuk kali pertama, atau menetapkan semula tempat kejadian. Dalam keadaan itu akan menjadi baik, selagi orang Rigidbody tidak berpotongan objek lain.

Perkara ini kerana, apabila orang tegar dipindahkan ke kedudukan yang tepat atau keadaan putaran, ia boleh melalui objek. Enjin fizik kemudiannya harus membetulkan isu ini, dan kebanyakan masa enjin fizik tidak berjalan pada masa yang sama Unity's Update() mesej tidak. Hasil akhirnya adalah tingkah laku yang jitter apabila terdapat persimpangan, dan mungkin orang tegar dapat melewati objek sepenuhnya.

Satu lagi kesan sampingan yang buruk yang boleh berlaku apabila, katakan, menggerakkan orang tegar di sepanjang paksi untuk pergerakan pemain adalah secara dalaman orang tegar disimulasikan dan kemudian ia memohon kedudukannya. Mengemas kini kedudukan kemudian menggerakkan orang tegar tanpa mengambil kira perubahan halaju dan sebagainya. Sekiranya orang tegar itu bergerak ke belakang cerun, ia akan memindahkan orang yang tegar ke belakang semasa kedudukan pengubah kedudukan anda akan memindahkan orang tegar ke belakang cerun.

Objek Rolling Forever

Katakan anda sedang membangunkan permainan golf. Terdapat masalah dengan bagaimana bola golf tidak berhenti bergolek, dan entah bagaimana berjaya terus bergolek selamanya selagi tidak ada lubang atau parit dalam laluannya. Sebab mengapa ini berlaku adalah kerana dalam kehidupan sebenar, bola akan diperlahankan oleh rumput yang berlari (antara lain), kerana ia harus menolak bilah rumput kecil ke bawah, rumput pada dasarnya adalah seperti jalan tetap. Ini dipanggil rintangan bergulir. Perpaduan tidak boleh mensimulasikan perilaku ini secara tepat, jadi sebaliknya daya hentakan tiruan mesti digunakan.

Dalam Perpaduan, daya terbaik untuk digunakan untuk menghentikan objek dari rolling forever adalah "sudut sudut". Mengubah hujung sudut pada bola golf adalah cara untuk menyelesaikan masalah ini. Nilai sebenar benar-benar bergantung pada tingkah laku yang anda cari, namun anda mungkin mendapati bahawa nilai seretan sudut 1.0 mungkin tidak cukup dalam beberapa kes.

Objek Tanpa Keberanian

Hampir setiap objek di dunia melantun selepas kesan. Bahan perpaduan dalaman, fizik lalai tidak ada lantunan sama sekali. Maksudnya setiap objek tidak akan melantun kecuali jika Anda menimpa materi fisika lalai atau menerapkan bahan fisika pada objek di adegan Anda dengan nilai bounciness lebih tinggi dari 0.

Salah satu cara terbaik untuk membetulkan isu ini ialah dengan mencipta bahan fizik lalai anda sendiri dan menetapkannya dalam Pengurus Fizik yang ditemui dengan mengklik Edit> Tetapan Projek> Fizik.

Rigidbodies Sebahagian Tenggelam Ke Geometri

Kebanyakan enjin fizik mempunyai beberapa jenis parameter yang menentukan berapa banyak dua objek boleh menginternetik atau bersilang sehingga mereka ditolak dari satu sama lain. Parameter ini dipanggil Penembusan Min Untuk Penalti dalam Perpaduan. Secara lalai nilai ini adalah 0.01 (meter), yang bermaksud, secara lalai, objek boleh memotong sehingga 1 sentimeter (hampir 0.4 inci) sebelum ditolak.

Anda perlu menetapkan Penembusan Min Untuk Penalti kepada nilai di mana ia tidak dapat dilihat dengan jelas bahawa objek bersilang. Menetapkan nilai kepada sesuatu yang kecil, seperti 0.0001, boleh menyebabkan kekakuan tegar.

Cara Mencegah Kesilapan

Kod Penulisan untuk Rigidbodies (untuk Programmer)

Jika anda bukan pengaturcara, anda tidak perlu bimbang tentang senario berikut. Apabila menulis kod yang bergerak, berputar, atau membuat tegar tegar, penting untuk menyimpannya dalam gelung FixedUpdate. Menulis kod ini dalam gelung Kemas kini berpotensi membawa kepada keputusan yang tidak stabil, kerana fungsi Kemas kini boleh dipanggil pada 1000 Hz, manakala enjin fizik dan fungsi FixedUpdate masing-masing dipanggil pada 50 Hz secara lalai.

Anda boleh menukar kekerapan pada langkah fizik dengan mengubah parameter Tetap Timestep, yang terdapat dalam Edit> Tetapan Projek> Masa. Nilai menentukan berapa banyak masa yang menunggu, dalam saat, antara setiap kemas kini atau langkah fizik. Anda boleh menggunakan kekerapan dalam Hertz dengan membahagikan 1 dengan nilai (contohnya, tunggu 0.01 detik bermakna 1 / 0.01 = 100 Hz). Semakin sering langkah-langkah, semakin tepat dan stabil simulasi itu. Walau bagaimanapun, menetapkan kekerapan yang lebih tinggi daripada CPU yang boleh dikendalikan akan menghasilkan simulasi yang sangat tidak stabil. Cuba simpan kekerapan Kemas Kini Tetap antara 30 Hz dan 100 Hz.

Semasa bekerja di dinding bata destructible, saya berlari ke masalah yang disebabkan oleh bata Instantiating selepas sebahagian dinding telah musnah. Saya menetapkan masalah ini dengan meletakkan kod bermasalah ke dalam Coroutine, dan meletakkan baris berikut sebelum Memusnahkan objek:


Dalam menunggu bingkai, ia akan menjamin bahawa logik itu disegerakkan dalam masa Kemaskini, dan bukannya masa FixedUpdate. Ini seolah-olah bermaksud bahawa fungsi Destroy dilaksanakan selari dengan gelung Kemas Kini.

Petua Perpaduan Bonus: Jangan gunakan Bahan Fizik Aset Piawai!

Pakej Bahan Fizik, yang menjadi sebahagian daripada Aset Piawaian Perpaduan, sebenarnya hampir tidak berguna. Terdapat lima bahan fizik yang terkandung dalam pakej, dan semuanya tidak realistik dalam beberapa cara.

Setiap bahan mempunyai geseran statik dan dinamik yang sama. Di dunia nyata, objek yang berdiri masih mempunyai sedikit geseran maka ketika mereka bergerak. Koefisien geseran bahan Getah adalah 1.0, yang tidak sama dengan apa-apa getah yang terdapat di dunia nyata. Dan jika itu tidak cukup bodoh, setiap bahan mempunyai 0 ''bounciness'' (tidak termasuk bahan ''Bouncy''). Ini semua bermakna bahawa bahan-bahan tersebut bukanlah perwakilan yang dekat dengan rakan niaga sebenar mereka.

Adalah lebih baik untuk membuat bahan fizik anda sendiri apabila perlu. Terdapat banyak laman web di sekeliling bahagian sifat fizikal bahan—yang penting yang gesekan dinamik, geseran statik, dan restitusi atau bounciness.

Kesimpulan

Sangat sedikit masalah berkaitan fizik sebenarnya yang sukar untuk diperbaiki. Sekiranya terdapat sebarang jenis bug berkaitan fizik yang kelihatan sukar untuk dikesan, cuba melambatkan masa untuk melihat apa yang berlaku. Jika anda perasan bahawa isu ini bermula di sekitar kod tertentu, anda boleh menggunakan Debug.Break untuk menjeda editor dan memeriksa apa yang berlaku. Jangan ragu untuk mengulas di sini jika anda mempunyai sebarang pertanyaan atau memerlukan bantuan.

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.