Saya melihat ada masalah dalam pemeriksaan darat pengontrol orang ketiga Unity.
Pemeriksaan darat harus mendeteksi apakah pemain berdiri di tanah atau tidak. Ia melakukannya dengan mengirimkan sinar di bawah pemain.
Namun, jika pemain berdiri di atas dan di tengah dua kotak dan ada ruang di antara kotak-kotak ini, maka sinar menembak ke celah dan pemain berpikir dia tidak bersentuhan dengan tanah, yang terlihat seperti ini:
Saya tidak bisa bergerak. Anda dapat dengan jelas melihat bahwa sinar ada di celah dan dengan demikian pohon animator pemain campuran udara aktif.
Apa cara terbaik untuk mengatasi masalah ini?
Saya berpikir untuk memotret banyak sinar, dari asal yang sama tetapi dengan sudut yang berbeda. Dan OnGround
seharusnya hanya benar, jika X% dari sinar ini mengenai "tanah". Atau ada cara yang lebih baik?
sumber
Debug.DrawLine
? Sulit untuk memvisualisasikan, saya tidak dapat menulis skrip.Sejujurnya saya berpikir bahwa pendekatan "banyak sinar" adalah ide yang cukup bagus. Saya tidak akan menembak mereka pada sudut, tapi saya akan mengimbangi sinar, seperti ini:
Pemain adalah stickman biru; Panah hijau mewakili sinar tambahan, dan titik oranye (RaycastHits) adalah titik di mana kedua sinar itu mengenai kotak.
Idealnya dua sinar hijau harus diposisikan tepat di bawah kaki pemain, untuk mendapatkan ketelitian paling untuk memeriksa apakah pemain di-ground atau tidak;)
sumber
Saya pikir saya menyelesaikannya dengan mengubah
Physics.Raycast
kePhysics.SphereCast
dalam skripThirdPersonCharacter.cs
. Tetapi masih perlu pengujian.Saya juga harus mengomentari baris ini yang mengubah
m_GroundCheckDistance
nilai, jika tidak ada beberapa sliding aneh pada beberapa model:Dan saya berubah
m_GroundCheckDistance = 0.1f;
menjadim_GroundCheckDistance = m_OrigGroundCheckDistance;
:Seluruh Skrip:
sumber
Mengapa tidak menggunakan fungsi OnCollisionStay Unity ?
Pro:
Anda tidak harus membuat raycast.
Ini lebih akurat daripada raycast: Raycast adalah metode shoot-to-check, jika pemotretan raycast Anda tidak cukup cakupan, maka itu mengarah ke bug yang menjadi alasan mengapa Anda mengajukan pertanyaan ini.
OnCollisionStay
Metode benar-benar memeriksa apakah ada sesuatu yang menyentuh - itu sangat cocok untuk tujuan memeriksa apakah pemain menyentuh tanah (atau apa pun yang pemain dapat mendarat).Untuk kode dan demo, periksa jawaban ini: http://answers.unity.com/answers/1547919/view.html
sumber