Fisika telah menjadi bagian integral dari setiap permainan modern. Entah itu simulasi jaringan sederhana atau fisika lalu lintas yang lengkap. Game seluler tidak terkecuali. Namun, ketika mengatur fisika untuk mereka, Anda perlu melihat kembali pada keterbatasan yang terkait dengan kinerja yang relatif buruk dari perangkat generasi yang didukung. Artis teknis 3D terkemuka
Banzai.Games Roman Tersky mengatakan bagaimana timnya mengintegrasikan fisika ke dalam gameplay game pertarungan seluler Shadow Fight 3, teknik mana yang digunakan untuk optimasi dan bagaimana ia menulis ulang fisika dari awal untuk karakter untuk mencapai determinisme penuh dalam PVP sinkron.
Fisika Solid State

Peralatan karakter dalam Shadow Fight 3 memiliki banyak elemen yang tunduk pada simulasi fisik, yang menambahkan dinamika pada apa yang terjadi di layar. Salah satu kesulitan utama yang kami temui ketika membuat fisika untuk elemen-elemen ini adalah kenyataan bahwa tulang-tulang yang melekat padanya terletak di dalam hierarki kerangka karakter itu sendiri. Ketika bergerak, mereka mengulangi transformasi tulang induk dan tidak menerima dorongan fisik yang realistis.
Pendeteksi Tulang
Solusi termudah adalah melepaskan tulang. Setelah menginisialisasi semua elemen peralatan menggunakan skrip, kami menghapus tulang elemen aktif secara fisik dari hierarki kerangka karakter dan, menggunakan komponen
Character Joint , membuat koneksi dengan tulang induk.

Namun, kami dihadapkan dengan kesalahan kecil yang timbul dari penarikan fps: dalam hal ini, tulang mengalami simulasi fisik, dengan sedikit keterlambatan, "mengejar" tulang yang terhubung dengan Joint. Sebagai aturan, kesalahan ini sangat tidak signifikan sehingga bisa diabaikan. Untuk kasus lain, solusi alternatif diterapkan.
Dorongan palsu
Pertimbangkan solusi ini menggunakan contoh helm perampok, lambang Spartan yang dikenakan simulasi fisik. Kami membagi sisir menjadi 5 bagian, yang masing-masing dikuliti dengan tulang yang berbeda. Dalam pengaturan Sambungan dari tulang-tulang ini, mereka menetapkan batas rotasi sepanjang sumbu yang diinginkan dan mengatur parameter
Pegas Batas Putar , yang bertanggung jawab atas efek pegas.

Untuk simulasi yang realistis secara fisik, tulang crest dikeluarkan dari hirarki karakter, namun, dalam kasus penarikan fps, misalnya, pada perangkat yang lemah, mesh diregangkan dengan jelek karena โmenangkapโ tulang.

Oleh karena itu, kami memutuskan untuk meninggalkan tulang puncak di dalam hierarki karakter, dan untuk meningkatkan dinamisme mereka memberi mereka dorongan palsu. Untuk melakukan ini, kami perlu di setiap animasi (kecuali untuk posisi tempur) untuk menentukan saat kapan harus menerapkan impuls, serta arahnya.
Orang dapat membaca jumlah frame dalam animasi saat ini, kemudian kurangi 15-20 frame dari nilai ini dan menerapkan impuls setelah perbedaan yang diterima. Namun, kami berhasil menghindari aritmatika yang tidak perlu dengan menghubungkan momen pulsa ke akhir
interval animasi yang
tidak terputus .
Setiap animasi (sekali lagi, kecuali untuk posisi bertarung) memiliki periode pra-konfigurasi dimana pemain tidak dapat menghentikannya. Setelah periode ini atau pada saat menerima dampak, interval
tanpa gangguan mengakhiri aksinya, dan pada saat ini dorongan kita terpicu. Yang diperlukan hanyalah mengkonfigurasi pengecualian untuk beberapa animasi.

Dengan demikian, dorongan dipicu beberapa frame sebelum akhir setiap animasi, seperti yang kami butuhkan. Pada saat inisialisasi pulsa, kita membaca koordinat di mana tulang berada dalam bingkai sebelumnya dan saat ini, menerima vektor gerakannya. Pada poros ini impuls kita diterapkan.
Item peralatan
Untuk mengoptimalkan, kami mencoba menggunakan colliders sesedikit mungkin ketika mensimulasikan fisika untuk berbagai elemen peralatan karakter. Dalam kebanyakan kasus, kami berhasil melakukan ini dengan memanipulasi hanya pembatasan di sepanjang sumbu dalam pengaturan gabungan dari tulang di mana simulasi dilakukan.


Dalam beberapa kasus (misalnya, dengan pelat logam) penggunaan colliders tidak bisa dihindari. Namun, beban utama bukanlah kehadiran colliders, tetapi perhitungan tabrakan mereka. Menyetel
Matriks Tabrakan Lapisan dalam
Pengaturan Proyek membantu meminimalkan beban ini. Untuk elemen seperti itu, kami menggunakan dua lapisan terpisah yang hanya bertabrakan di antara mereka, sehingga menghindari salah perhitungan tabrakan dengan collider dari lapisan lain (senjata, lantai, dinding, dll)

Klon fisik
Shadow Fight 3 memiliki beberapa jenis senjata yang simulasi fisiknya digunakan di luar animasi menyerang. Saat ini, ini adalah pisau pada rantai, kusarigama, nunchaku dan flail. Untuk alasan yang dijelaskan di atas, kami memutuskan untuk menghapus tulang senjata dari hierarki karakter di luar animasi yang menyerang dan mengembalikannya ketika simulasi fisik tidak diperlukan. Dengan memanipulasi parameter
Is Kinematik dalam komponen
Rigidbody dari tulang, tergantung pada situasinya, kita menghidupkan dan mematikan fisika
untuknya .
Namun, ketika menggunakan Kusarigama dan pisau pada rantai, kami menjumpai peningkatan beban pada perangkat yang lemah dan mengalami drawdown fps. Masalah muncul tepat ketika tulang kembali ke hierarki karakter dan simulasi fisik dimatikan untuk mereka. Hal ini disebabkan oleh fakta bahwa mengubah transformasi tulang induk dalam hirarki kerangka menempatkan tekanan pada mesin fisika untuk setiap tulang anak di mana ada komponen
Rigidbody , bahkan jika parameter
Is Kinematic aktif. Dan semakin lama hierarki, semakin besar bebannya.

Solusinya adalah membuat klon fisik. Pertimbangkan ini dengan contoh pisau pada rantai.
Selama pemuatan pertempuran, 2 kerangka diinisialisasi untuknya: yang utama, yang terletak di dalam hierarki karakter, dan klon fisiknya. Tidak ada komponen
Rigidbody di tulang kerangka utama, hanya trek animasi yang memengaruhi transformasi mereka. Tulang kedua memiliki koneksi yang disetel (Sambungan) dan komponen
Rigidbody dengan parameter aktif Is Kinematic.
Sementara transformasi tulang kerangka utama dipengaruhi oleh trek animasi, misalnya, selama hit, parameter
Is Kinematik dalam komponen
Rigidbody dari tulang klon fisik tetap aktif. Tulang tidak ditransformasikan dan tidak tunduk pada simulasi fisik. Selama bingkai terakhir dari animasi, transformasi tulang dari dua kerangka disinkronkan. Klon fisik membaca posisi dan rotasi tulang-tulang kerangka utama dan menetapkan parameter yang sama persis. Apakah Kinematik kemudian dinonaktifkan, dan tulang-tulang klon fisik disimulasikan. Selanjutnya, sampai dimulainya animasi serangan berikutnya, yang sudah menjadi kerangka utama, setiap frame membaca transformasi tulang klon fisik, yang pada saat itu bergerak dalam fisika, dan menetapkan parameter ini ke tulang mereka. Pendekatan ini telah secara signifikan mengurangi beban pada mesin fisika dan meningkatkan kinerja pada perangkat yang lemah.

Simulasi jaringan
Saat menyiapkan simulasi jaringan sebagai bagian dari kinerja perangkat seluler, batasan utama adalah penggunaan tumbukan jaringan dengan colliders. Alternatif yang lebih murah adalah dengan menyetel
Permukaan Penetrasi untuk bahan kain. Karena dalam permainan kami ada banyak animasi dan berbagai pose karakter, daftar yang paling "berbahaya" dikompilasi, di mana semua jaringan diperiksa untuk penetrasi melalui bagian lain dari tubuh.


Kami juga menggunakan simulasi jaringan untuk membuat efek nyala api FX pada senjata dan di kepala bos Shadow Mind. Dalam pengaturan
Cloth untuk elemen-elemen ini, kami mematikan pengaruh gravitasi dan mengatur nilai Percepatan sepanjang sumbu Y: konstan, sehingga nyala api akan bergerak ke atas, dan secara acak untuk efek berkibar. Sehingga saat bergerak tidak akan ada distorsi tajam pada geometri, kami mengatur nilai resistansi yang meningkat (
Redaman ). Dengan demikian, kami mendapat efek nyala kinerja yang cukup realistis dan murah.


Fisika deterministik untuk Synchronous PvP
Pada saat kematian dan dalam situasi tertentu, ketika dipukul untuk karakter dalam Shadow Fight 3, simulasi fisika diaktifkan. Untuk waktu yang lama, fisika solid-state Unity stock digunakan untuk ini. Namun, ketika memperkenalkan PVP sinkron ke dalam proyek, itu harus ditinggalkan demi pengembangannya sendiri.
Synchronous PVP menyiratkan simulasi permainan yang sama pada dua klien. Tidak ada masalah dengan animasi, karena semuanya dihitung terlebih dahulu, sementara masalah tertentu muncul dengan fisika.
Faktanya adalah bahwa perhitungan floating point, yang digunakan di dalam fisika di Unity, bekerja secara berbeda pada prosesor dari produsen yang berbeda. Dalam hal ini, selama permainan, kesalahan dalam posisi karakter menumpuk - pada satu klien karakter terletak berbeda dari yang lain. Dan jika di luar fisika perbedaan ini dapat dengan mudah diperbaiki dengan menyinkronkan situasi secara berkala berdasarkan indikator dari salah satu klien, maka pada saat inisialisasi fisika, karena kesalahan awal posisi, simulasi fisik berkembang secara berbeda pada dua klien.
Akibatnya, karakter secara signifikan di tempat dan posisi yang berbeda. Setelah perbedaan tersebut, cepat atau lambat suatu situasi akan muncul di mana serangan akan direkam pada satu klien dan tidak pada yang lain.
Sekilas, solusi paling sederhana adalah mengambil posisi karakter pada satu klien dan mentransfernya ke yang lain sambil menyinkronkannya selama simulasi fisik. Tetapi regdoll karakter adalah hierarki tulang yang panjang dengan sejumlah besar padatan independen yang terpisah (tungkai, kepala), untuk sinkronisasi posisi yang benar yang Anda perlukan untuk mentransfer sejumlah besar data dalam waktu singkat. Pilihan ini ternyata terlalu "mahal", jadi kami memutuskan untuk menulis fisika kami sendiri, yang akan menjadi deterministik. Sehingga kita dapat yakin bahwa pada klien mana pun keadaan fisik karakter bersamaan, terlepas dari prosesor mana perhitungan dilakukan.

Jadi, apa regdoll kita? Tubuh terdiri dari node, yang merupakan titik material. Mereka tidak memiliki orientasi, tetapi ada posisi dan massa, dan di antara mereka link dari kekakuan disesuaikan dapat direalisasikan. Sekelompok node tersebut melekat pada setiap tulang di dalam kerangka karakter. Arsitektur ini menyiratkan tidak adanya tabrakan internal dan keterbatasan dalam sambungan, dan tabrakan eksternal dan gesekan diimplementasikan pada tingkat node. Ketika node bergerak di ruang angkasa, gravitasi, kekuatan eksternal dan inersia diperhitungkan.
Antara node ada dua jenis koneksi:
tulang rusuk kaku (biru) dan
otot elastis (merah). Tulang rusuk memainkan peran tulang, memaksa simpul berada pada jarak tertentu dari satu sama lain dan mencegah mereka dari hamburan ke arah yang berbeda. Otot-otot dari posisi awal mana pun membentuk pose tertentu dari node, menariknya bersama-sama jika jarak di antara mereka lebih besar dari nilai target, dan mendorong mereka terpisah jika kurang.


Lihatlah "di bawah tenda" dan lihat cara kerjanya. Pertama, kami membiarkan node bergerak dengan bebas, kemudian secara iteratif menyesuaikan tautan sehingga mereka kembali ke karakteristik target mereka. Untuk satu iterasi penyesuaian otot, dua iterasi penyesuaian tulang rusuk diperlukan. Dengan membuat tulang rusuk lebih kaku, kita dapat yakin bahwa koneksi tulang rusuk tidak akan putus setelah otot-otot terkena node.

Akibatnya, semakin kuat node berhasil bergeser pada tahap pergerakan bebas, semakin banyak biaya komputasi yang harus diinvestasikan untuk mengembalikan tulang rusuk dan otot. Untuk meminimalkan biaya ini dan risiko gangguan struktural, kami memutuskan untuk memecah proses berulang menjadi beberapa langkah. Artinya, dalam satu frame beberapa kali gerakan bebas node dan koreksi terjadi. Dalam satu langkah, node berhasil bergerak lebih sedikit, dan menyesuaikannya menjadi lebih mudah. Dengan demikian, kami serius menghemat jumlah iterasi yang diperlukan untuk menyesuaikan tulang rusuk dan otot.

Set panjang otot menentukan pose target, yang dicari karakter dari posisi apa pun setelah transisi ke simulasi fisik. Untuk menghindari transisi yang terlalu mendadak dan gangguan struktural, kami telah menambahkan pos interpolasi. Pada saat memasuki fisika, kami mengambil pose karakter saat ini dan menjadikannya target, dan kemudian untuk lima puluh frame kami menyisipkannya ke pose target yang telah ditetapkan, mendapatkan transisi yang mulus.

Masalah utama yang kami temui saat menggunakan fisika kami adalah memutar-mutar anggota badan secara berkala, terutama lengan. Hal ini disebabkan oleh fakta bahwa pada saat transisi ke fisika, karakter mungkin berada dalam posisi yang jauh dari target, di mana otot-ototnya menegang. Untuk meminimalkan, dan di masa depan, sepenuhnya menghindari situasi seperti itu, sejumlah langkah diterapkan. Pertama-tama, kami membuat beberapa pose target yang ototnya bisa mengencangkan kelenjar. Pada saat kita memasuki fisika, kita mengambil pose saat ini, melihat di mana dari target yang ditetapkan sebelumnya yang paling dekat dengannya, dan kencangkan simpul ke sana.

Awalnya, ketika pindah ke fisika, otot-otot dengan kaku mendorong node, membawa mereka ke posisi yang diinginkan. Seringkali ketajaman penolakan ini juga menyebabkan fakta bahwa ekstremitas sangat kuat. Kami menambahkan peningkatan kekuatan otot yang lancar, yang sangat memperbaiki situasi. Selama dua frame pertama setelah dimulainya simulasi fisika, kekuatan otot tetap pada batas maksimum untuk menstabilkan node setelah menerapkan impuls kepada mereka. Kemudian otot-otot rileks, kekuatan mereka menjadi 55%, dan kemudian lebih dari 120 membingkai kekuatan secara bertahap meningkat hingga 100%.

Langkah terakhir adalah penambahan dua simpul penstabil: bagian depan setinggi dada dan bagian belakang setinggi kaki. Node ini memiliki koneksi tulang rusuk dengan node tetap dada dan panggul, masing-masing, dan node tidak stabil kencang dengan otot. Node stabilisasi memiliki nilai massa rendah dan tidak memiliki benturan dengan lantai, tidak seperti node lainnya.

Dalam gif di bawah ini, Anda melihat hasilnya: kami mendapatkan fisika deterministik sepenuhnya, dibangun berdasarkan perhitungan bilangan bulat, bekerja secara stabil pada 60 fps bahkan pada perangkat terlemah yang kami dukung.

Ikuti Banzai Games di jejaring sosial: Facebook , Vkontakte , Instagram , LinkedIn
Tim Banzai Games membutuhkan spesialis VFX yang berpengalaman. Baca lebih lanjut tentang lowongan di sini .