Wieso kann ich unendlich oft springen?


07.12.2022, 01:40

Ich benutze Unity und Visual Studio Code*

Aventus9999  07.12.2022, 01:53

Könntest du den Code nocheinmal in Textform einfügen, damit ich ihn kopieren kann?

SgtAngst18 
Fragesteller
 07.12.2022, 01:56

steht in der Antwort unten

4 Antworten

Also die Collision ist am Boden, soviel steht fest.

Es wirkt aber so, als würde der korrekte und unmissverständliche Befehl fehlen
das der Jump den nächsten Jump blockiert bis eine Collision stattgefunden hat.

Ist aber nur eine Vermutung.

SgtAngst18 
Fragesteller
 07.12.2022, 01:54

Mal schauen

0
SgtAngst18 
Fragesteller
 07.12.2022, 01:56

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class Walk : MonoBehaviour

{

   Rigidbody rb;

   public Vector3 jump;

   public float jumpForce;

   public bool isGrounded;

  

  void Start()

  {

    rb = GetComponent<Rigidbody>();

    jumpForce = 2.0f;

    jump = new Vector3(0.0f, 2.0f, 0.0f);

  }

  void OnCollisionStay(){

    isGrounded = true;

  }

  void Update()

  {

    if (Input.GetKey(KeyCode.RightArrow))

    {

      

      rb.velocity = new Vector3(rb.velocity.x + 0.03f, rb.velocity.y , rb.velocity.z);

    }

    if (Input.GetKey(KeyCode.LeftArrow))

    {

      

      rb.velocity = new Vector3(rb.velocity.x - 0.03f, rb.velocity.y , rb.velocity.z);

    }

  

    if (Input.GetKeyDown(KeyCode.Space) && isGrounded) {

      rb.AddForce(jump * jumpForce, ForceMode.Impulse);

    }

  }

}

0

Der Charakter kann in diesem Code unendlich oft springen, weil es keine Bedingung gibt, die besagt, dass der Charakter nicht mehr springen kann, nachdem er bereits gesprungen ist. In der Update-Methode wird überprüft, ob der Spieler die Leertaste gedrückt hat und ob der Charakter auf dem Boden ist. Wenn beide Bedingungen erfüllt sind, wird die Sprungkraft auf den Charakter angewendet. Es gibt jedoch keine Überprüfung, die verhindert, dass der Spieler die Leertaste erneut drücken kann, wodurch der Charakter unendlich oft springen kann. Um das zu beheben, könnte man zum Beispiel eine Variable einführen, die angibt, ob der Charakter gerade springt, und die Überprüfung in der Update-Methode entsprechend anpassen.

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class Walk : MonoBehaviour
{
    Rigidbody rb;
    public Vector3 jump;
    public float jumpForce;
    public bool isGrounded;
    public bool isJumping; // Neue Variable, die angibt, ob der Charakter gerade springt

    void Start()
    {
        rb = GetComponent<Rigidbody>();
        jumpForce = 2.0f;
        jump = new Vector3(0.0f, 2.0f, 0.0f);
    }

    void OnCollisionStay()
    {
        isGrounded = true;
    }

    void Update()
    {
        if (Input.GetKey(KeyCode.RightArrow))
        {
            rb.velocity = new Vector3(rb.velocity.x + 0.03f, rb.velocity.y , rb.velocity.z);
        }
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            rb.velocity = new Vector3(rb.velocity.x - 0.03f, rb.velocity.y , rb.velocity.z);
        }

        // Überprüfen, ob der Charakter auf dem Boden ist und nicht gerade springt
        if (Input.GetKeyDown(KeyCode.Space) && isGrounded && !isJumping)
        {
            isJumping = true; // Charakter beginnt zu springen
            rb.AddForce(jump * jumpForce, ForceMode.Impulse);
        }
    }

    // In FixedUpdate wird überprüft, ob der Charakter den Boden berührt
    void FixedUpdate()
    {
        if (isGrounded && isJumping)
        {
            isJumping = false; // Charakter hat den Boden berührt und hört auf zu springen
        }
    }
}

In diesem Code wurde eine neue Variable namens

isJumping

hinzugefügt, die angibt, ob der Charakter gerade springt. In der Update-Methode wird überprüft, ob der Charakter auf dem Boden ist und nicht gerade springt, bevor die Sprungkraft angewendet wird. In der FixedUpdate-Methode wird überprüft, ob der Charakter den Boden berührt und gerade springt, und in diesem Fall wird die

isJumping

-Variable auf

false

gesetzt, um anzuzeigen, dass der Charakter nicht mehr springt.

SgtAngst18 
Fragesteller
 07.12.2022, 02:03

Ich kann leider immer noch in der Luft springen

0

Bleibt wenn du springst nicht ground weiterhin true?

Also wenn ja würde ein ground=false bei jedem jump das problem beheben

ich sehe nirgendwo, dass isGrounded wieder auf false gesetzt wird

SgtAngst18 
Fragesteller
 07.12.2022, 01:50

Ich hab es oben definiert, dachte das reicht

0