Zauważyłem problem podczas kontroli naziemnej kontrolera trzeciej osoby Unity.
Kontrola gruntu powinna wykryć, czy gracz stoi na ziemi. Robi to, wysyłając promień pod odtwarzaczem.
Jeśli jednak gracz stoi na górze i pośrodku dwóch pól, a między nimi jest odstęp, promień strzela w szczelinę, a gracz myśli, że nie ma kontaktu z ziemią, co wygląda następująco:
Nie mogę się ruszyć. Widać wyraźnie, że promień jest w szczelinie, a zatem drzewo mieszania w powietrzu animatora gracza jest aktywne.
Jaki jest najlepszy sposób rozwiązania tego problemu?
Myślałem o strzelaniu do wielu promieni tego samego pochodzenia, ale o różnych kątach. I OnGround
powinno to być prawdą tylko wtedy, gdy X% tych promieni uderzy w „ziemię”. Czy jest jakiś lepszy sposób?
źródło
Debug.DrawLine
? Trudno to sobie wyobrazić, nie jestem w stanie napisać skryptu.Szczerze uważam, że podejście „wielokrotnych promieni” jest całkiem dobrym pomysłem. Nie strzelałbym ich jednak pod kątem, zamiast tego odsunąłem promienie, coś takiego:
Gracz jest niebieskim stickman; Zielone strzałki reprezentują dodatkowe promienie, a pomarańczowe punkty (RaycastHits) to punkty, w których dwa promienie uderzają w pola.
Idealnie dwa zielone promienie powinny być umieszczone tuż pod stopami gracza, aby uzyskać jak największą precyzję w sprawdzaniu, czy gracz jest uziemiony;)
źródło
Myślę, że rozwiązałem to, zmieniając
Physics.Raycast
naPhysics.SphereCast
w skrypcieThirdPersonCharacter.cs
. Ale wciąż wymaga testowania.Musiałem też skomentować ten wiersz, który zmieniał
m_GroundCheckDistance
wartość, w przeciwnym razie niektóre modele miały dziwne przesuwanie:I zmieniłem
m_GroundCheckDistance = 0.1f;
nam_GroundCheckDistance = m_OrigGroundCheckDistance;
:Cały skrypt:
źródło
Dlaczego nie skorzystać z funkcji OnCollisionStay firmy Unity ?
Plusy:
Nie musisz tworzyć raycast.
Jest dokładniejszy niż raycast: Raycast to metoda strzelania w celu sprawdzenia, jeśli strzelanie raycastem nie zapewnia wystarczającego zasięgu, prowadzi to do błędu, który jest przyczyną, dla której zadałeś to pytanie.
OnCollisionStay
Metoda dosłownie sprawdza, czy coś się dotyka - idealnie pasuje do celu sprawdzania, czy gracz dotyka ziemi (lub czegokolwiek, na czym gracz może wylądować).W przypadku kodu i wersji demonstracyjnej sprawdź tę odpowiedź: http://answers.unity.com/answers/1547919/view.html
źródło