Wie bringe ich meinen Charakter dazu, hochwinklige Hänge hinunterzurutschen?

9

Ich arbeite gerade an der Bewegung meines Charakters in Unity3D . Ich habe es geschafft, ihn relativ zum Mauszeiger zu bewegen. Ich habe eine Neigungsgrenze von 45 ° festgelegt, die es dem Charakter nicht erlaubt, mit höheren Graden die Berge hinaufzugehen. Aber er kann sie trotzdem hochspringen.

Wie schaffe ich es, ihn wieder nach unten rutschen zu lassen, wenn er an Stellen mit zu hoher Neigung sprang?

Danke im Voraus.

edit: Codefragment meiner Grundbewegung. mit UnityEngine; using System.Collections;

public class BasicMovement : MonoBehaviour {
    private float speed;
    private float jumpSpeed;
    private float gravity;
    private float slopeLimit;
    private Vector3 moveDirection = Vector3.zero;

    void Start() 
    {
        PlayerSettings settings = GetComponent<PlayerSettings>();
        speed = settings.GetSpeed();
        jumpSpeed = settings.GetJumpSpeed();
        gravity = settings.GetGravity();
        slopeLimit = settings.GetSlopeLimit();
    }

    void Update() {
        CharacterController controller = GetComponent<CharacterController>();
        controller.slopeLimit = slopeLimit;

        if (controller.isGrounded) {
            moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
            moveDirection = transform.TransformDirection(moveDirection);
            moveDirection *= speed;

            if (Input.GetButton("Jump")) {
                moveDirection.y = jumpSpeed;
            }

        }
        moveDirection.y -= gravity * Time.deltaTime;
        controller.Move(moveDirection * Time.deltaTime);
    }
}
keinabel
quelle
Benötigen Sie weitere Informationen: Verwenden Sie die Physik? Verwenden diese Pisten das Geländesystem oder etwas anderes? Welche Komponente oder Komponenten steuern Ihren Charakter? Ist das ein 2D- oder 3D-Spiel?
Kylotan
Meinen Sie Rutschen, wenn der Spieler versucht zu springen oder wenn er einen Sprung vollendet und die Piste trifft?
Tyjkenn
@tyjkenn Ich meine, wenn er den Sprung vollendet. Wie in Super Mario 64. Wenn er auf dem Boden landet und dieser Boden zu hochwinklig ist, sollte er bis zu einem Punkt nach unten rutschen, an dem der Winkel gleich dem Neigungslimit ist.
keinabel
@Kylotan Nun, ich bin ein ziemlicher Neuling bei Unity. Also versuche ich so gut ich kann eine Antwort zu geben. Ich habe mit dem Character Controller einen Charakter erstellt - keinen starren Körper. Ich ließ ihn sich bewegen, wenn eine Taste gedrückt wurde, und ich ließ ihn relativ zum Cursor laufen. Ich habe ein Terrain erstellt und den Button (oh mein Gott, das muss dumm klingen) verwendet, um einige Berge zu erstellen. Dies wird ein 3D-Spiel mit Aussehen und Kamerastil wie WarCraft III sein.
keinabel

Antworten:

1

Ihr Bremsen, wenn der Boden getroffen wird, ist falsch. Sie stoppen einfach die vertikale Bewegung, aber so funktioniert ein Bodenschlag nur, wenn der Boden flach ist.

Was Sie tun sollten, ist moveDirectionauf die Oberfläche zu projizieren, die getroffen wird, die Ihnen das Neue gibt moveDirection. Wenn Ihre Bibliothek eine Funktion zum Projizieren eines Vektors auf eine Ebene oder Oberfläche hat, sollten Sie diese verwenden. Wenn nicht, sollten Sie die moveDirectionProjektion auf die Oberflächennormale von sich moveDirectionselbst subtrahieren .

aaaaaaaaaaaa
quelle
Es gibt Spiele, die dasselbe Verhalten verwenden, z. Skyrim, verwenden Sie genau die gleiche Methode zum Bremsen. Das Problem ist, dass der Charakter springen kann , auch wenn er sich nicht auf einem Flaggenboden befindet.
Ali1S232
0

Überprüfen Sie vor dem Springen, ob der Charakter auf einem Boden steht. Ich meine, wenn er sich nicht auf einem hohen Winkel befindet. und alles andere der Physik-Engine überlassen.

Anhand des von Ihnen angegebenen Codes kann ich sehen, wo das Problem liegt:

gemäß Skriptverweis Unity , CharacterController.isGroundedRückkehr nur dann , wenn Zeichen auf den Boden berühren. Es wird nicht nach Slopelimit gesucht. Nach ein wenig Suchen scheint FPSWalkerEnhanced etwas zu sein, das Ihr Problem löst.

Ali1S232
quelle
Nun, ich kann überprüfen , ob das Zeichen vor jeder Bewegung geerdet ist.
keinabel
@keinabel dann sollte er nicht springen können. Der einzige Weg, wie er mit Springen die Hänge hinaufsteigen kann, ist, wenn er springen kann, auch wenn er sich nicht auf festem Boden befindet. Ich meine, es ist nur so, als ob Sie überprüfen, ob er die Hänge nicht hochgehen kann. Wenn er aufgrund der Neigung nicht in mindestens eine Richtung gehen kann, sollte er überhaupt nicht springen können.
Ali1S232
Würde es helfen, wenn ich meinen 'Bewegungscode' zu meinem Beitrag hinzufüge?
keinabel
Ich denke, ich könnte direkt auf das Problem hinweisen.
Ali1S232