Ich habe ein Problem bei der Bodenkontrolle des Unity Third-Person-Controllers festgestellt.
Die Bodenkontrolle sollte feststellen, ob der Spieler auf dem Boden steht oder nicht. Dazu wird unter dem Player ein Strahl ausgesendet.
Wenn der Spieler jedoch oben und in der Mitte von zwei Kisten steht und sich zwischen diesen Kisten ein Leerzeichen befindet, schießt der Strahl in die Lücke und der Spieler denkt, dass er keinen Bodenkontakt hat, was so aussieht:
Ich kann mich nicht bewegen. Sie können deutlich sehen, dass sich der Strahl in der Lücke befindet und somit der vom Player-Animator übertragene Mischbaum aktiv ist.
Was ist der beste Weg, um dieses Problem zu lösen?
Ich dachte daran, mehrere Strahlen von demselben Ursprung, aber mit unterschiedlichen Winkeln zu schießen. Und OnGround
sollte nur wahr sein, wenn X% dieser Strahlen auf den "Boden" treffen. Oder gibt es einen besseren Weg?
quelle
Debug.DrawLine
? Es ist schwer zu visualisieren, ich kann das Skript nicht schreiben.Ich denke ehrlich, dass der Ansatz "mehrere Strahlen" eine gute Idee ist. Ich würde sie aber nicht im Winkel schießen, sondern die Strahlen irgendwie versetzen, so etwas wie:
Der Spieler ist der blaue Strichmännchen; Die grünen Pfeile stellen die zusätzlichen Strahlen dar, und die orangefarbenen Punkte (RaycastHits) sind die Punkte, an denen die beiden Strahlen auf die Kästchen treffen.
Im Idealfall sollten die beiden grünen Strahlen direkt unter den Füßen des Players positioniert werden, um möglichst genau zu prüfen, ob der Player geerdet ist oder nicht.
quelle
Ich glaube , ich löste es durch eine Änderung
Physics.Raycast
anPhysics.SphereCast
im SkriptThirdPersonCharacter.cs
. Aber es muss noch getestet werden.Ich musste auch diese Zeile auskommentieren, die den
m_GroundCheckDistance
Wert änderte , ansonsten gab es bei einigen Modellen ein komisches Gleiten:Und ich wechselte
m_GroundCheckDistance = 0.1f;
zum_GroundCheckDistance = m_OrigGroundCheckDistance;
:Gesamtes Skript:
quelle
Warum nicht Unity's benutzen? OnCollisionStay- Funktion von ?
Vorteile:
Sie müssen keinen Raycast erstellen.
Es ist genauer als Raycast: Raycast ist eine Methode zum Überprüfen von Aufnahmen. Wenn Ihre Raycast-Aufnahmen nicht ausreichend erfasst sind, führt dies zu Fehlern, weshalb Sie diese Frage gestellt haben.
OnCollisionStay
Die Methode prüft buchstäblich, ob sich etwas berührt - sie eignet sich perfekt, um zu überprüfen, ob der Spieler den Boden berührt (oder auf etwas, auf dem der Spieler landen kann).Code und Demo finden Sie in der folgenden Antwort: http://answers.unity.com/answers/1547919/view.html
quelle