Unity Spieler klebt an Wänden?


12.08.2024, 12:27

Hier der Code:

using System.Collections;

using System.Collections.Generic;

using System.Runtime.CompilerServices;

using UnityEngine;

public class movement : MonoBehaviour

{

   public float speed = 5;

   public float jump = 5;

   float moveVelocity;

   private Animator anim;

   private Rigidbody2D body;

   bool grounded = true;

   private void Awake()

   {

       anim = GetComponent<Animator>();

       body = GetComponent<Rigidbody2D>();

   }

   void Update()

   {

       //Jumping

       if (Input.GetKeyDown(KeyCode.Space) || Input.GetKeyDown(KeyCode.UpArrow) || Input.GetKeyDown(KeyCode.Z) || Input.GetKeyDown(KeyCode.W))

       {

           if (grounded)

           {

               GetComponent<Rigidbody2D>().velocity = new Vector2(GetComponent<Rigidbody2D>().velocity.x, jump);

               grounded = false;

               anim.SetBool("grndd", false);

           }

       }

       moveVelocity = 0;

       //Left Right Movement

       if (Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.A))

       {

           moveVelocity = -speed;

       }

       if (Input.GetKey(KeyCode.RightArrow) || Input.GetKey(KeyCode.D))

       {

           moveVelocity = speed;

       }

       GetComponent<Rigidbody2D>().velocity = new Vector2(moveVelocity, GetComponent<Rigidbody2D>().velocity.y);

       float horizontalInput = Input.GetAxis("Horizontal");

       if (horizontalInput > 0.01f)

           transform.localScale = new Vector3(3, 3, 1);

       else if (horizontalInput < -0.01f)

           transform.localScale = new Vector3(-3, 3, 1);

       anim.SetBool("run", horizontalInput != 0);

   }

   //Check if Grounded

   void OnCollisionEnter2D(Collision2D collision)

   {

       grounded = true;

       anim.SetBool("grndd", true);

   }

}

1 Antwort

Ich denke deine Kollisionsbehandlung testet nicht nur den Kontakt mit dem Boden, sondern mit jeglichem Objekt.

Wenn dein Spieler jetzt direkt an der Wand steht, dann ist die Kollision womöglich immer wahr und er kann deshalb nicht Springen, da seine Geschwindigkeit in y-Richtung gleich wieder auf 0 gesetzt wird.

Aber vielleicht ist das Problem auch noch komplizierter, da musst du denke ich etwas rumprobieren, bis du den Fehler findest.