Hari ini saya mencoba membuat pengontrol karakter 2D dengan kesatuan (menggunakan phisics). Saya cukup baru di mesin fisik dan sangat sulit untuk mendapatkan kontrol yang saya cari. Saya akan sangat senang jika ada yang bisa menyarankan solusi untuk masalah yang saya temukan:
Ini adalah FixedUpdate saya sekarang:
public void FixedUpdate()
{
Vector3 v=new Vector3(0,-10000*Time.fixedDeltaTime,0);
_body.AddForce(v);
v.y=0;
if(state(MovementState.Left))
{
v.x=-_walkSpeed*Time.fixedDeltaTime+v.x;
if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=-_maxWalkSpeed;
}
else if(state(MovementState.Right))
{
v.x= _walkSpeed*Time.fixedDeltaTime+v.x;
if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=_maxWalkSpeed;
}
_body.velocity=v;
Debug.Log("Velocity: "+_body.velocity);
}
Saya mencoba di sini untuk hanya menggerakkan tubuh kaku yang menerapkan gravitasi dan gaya linear untuk kiri dan kanan. Saya telah menyiapkan bahan fisik yang tidak membuat pantulan dan 0 gesekan saat bergerak dan 1 gesekan dengan diam. Masalah utama adalah bahwa saya memiliki colliders dengan lereng dan perubahan kecepatan dari naik (lebih lambat), menuruni lereng (lebih cepat) dan berjalan di collider lurus (normal). Bagaimana ini bisa diperbaiki? Seperti yang Anda lihat saya menerapkan allways kecepatan yang sama untuk sumbu x.
Untuk pemain saya memilikinya setup dengan posisi bola di kaki yang merupakan benda tegar yang saya lamar.
Tip lain yang bisa membuat hidup saya lebih mudah dengan ini disambut :).
PD Ketika pulang, saya perhatikan saya bisa menyelesaikan ini dengan menerapkan gaya konstan yang paralel ke permukaan pemain berjalan, tetapi tidak tahu apakah itu metode terbaik.
sumber
Jawaban:
Jika Anda ingin meniru platformer sekolah tua, langkah pertama adalah membuang fisika sama sekali. Anda akhirnya akan bertarung dengan sistem fisika untuk mendapatkan gerakan platformer sekolah tua yang jelas tidak realistis. Lihat pengganti CharacterController ini yang membuang fisika sekaligus untuk mendapatkan ide bagus tentang satu cara untuk mengimplementasikannya.
sumber
Anda mungkin akan lebih bahagia dengan apa yang direkomendasikan mheona. Tetapi jika Anda akan menggunakan fisika Unity, maka Anda mungkin ingin menggunakannya
ForceMode.VelocityChange
.Contoh:
Anda juga harus menerapkan gravitasi global dalam pengaturan Fisika proyek Anda, dan untuk objek yang ingin Anda jatuh lebih cepat, tambahkan komponen Gaya Konstan .
ForceMode.Impulse
serupa tetapi dipengaruhi oleh massa benda tegar. Membuatnya lebih sulit untuk disetel.sumber
Bahkan jika Anda tidak suka komponen Pengontrol Karakter bawaan (seperti yang saya lakukan), lihat kode contoh Unity untuk Tutorial Gameplay 2D .
Kode mengimplementasikan gameplay 2D lengkap dengan platform bergerak, musuh dan kotak dengan tabrakan, menggunakan Pengontrol Karakter.
Tetapi jika Anda bahkan tidak ingin melihatnya, saya sarankan Anda untuk meminimalkan penggunaan fisika dan mencoba untuk menyalin perilakunya dengan kode Anda sendiri. Tergantung pada jenis game 2D yang Anda rencanakan, mungkin ini akan bekerja dengan cukup baik. Misalnya, alih-alih menerapkan kekuatan untuk
Rigidbody.velocity
memindahkan karakter yang dapat Anda mainkan secara langsungTransform.Translate()
, yang memindahkan objekTransform.position
berdasarkan porosnya. Anda bisa menentukanforward
danback
terkait dengan objek itu sendiri atau mungkin platform atau lantaiTransform.up
, sehingga Anda akan tahu apakah itu jalan dan jenis tahu sudutnya.Juga jika Anda membuat semacam atribut kontrol kecepatan (mis. Berapa lama tombol ditekan) Anda dapat menerapkannya bersama dengan arah Anda sambil menerjemahkan untuk mencegah karakter Anda berjalan sesuatu yang terlalu condong tanpa kecepatan, seperti yang mereka lakukan pada Sonic the Hedgehog untuk Genesis / Mega Drive.
Jika Anda memilih untuk tetap menggunakan fisika saya tidak bisa membantu Anda sama sekali karena saya tidak begitu pandai dalam hal itu, tetapi perlu diketahui bahwa itu adalah perilaku normal untuk naik 'lereng' lebih lambat karena tubuh membutuhkan lebih banyak kekuatan untuk mengikuti , seperti kehidupan nyata.
sumber
Apa yang Anda inginkan, Pengontrol Karakter bawaan . Dengan mengatur
step offset
properti pada komponen ini, Anda dapat membuat pemain bergerak naik dan turun dengan mudah.sumber
Saya kira itu karena gaya tidak sejajar dengan platform dan hasilnya berakhir dengan kenaikan yang lebih rendah dan penurunan yang lebih tinggi.
Jika Anda menerapkan gaya relatif ke sistem koordinat
Anda ingin menjaga kecepatan maksimum dalam "x" dan membandingkannya dengan skalar, ingat bahwa kecepatan adalah vektor dan komposisi vx dan vy, di medan datar vy adalah nol, tetapi tentu saja pada lereng lebih besar dari nol.
Kecepatan berubah sesuai dengan arah tubuh, dan relatifnya berubah sehubungan dengan keseluruhannya
Ini dapat memodifikasi V Anda dengan cara yang tidak Anda inginkan juga:
mempertahankan VX global yang sama mungkin tampak aneh bagi mata. (Akselerasi yang Tidak Diinginkan)
sumber