twodeejumpnrun/Assets/Scripts/PlayerMovement.cs
2025-08-24 22:57:58 +02:00

109 lines
2.9 KiB
C#

using System;
using System.Diagnostics.Tracing;
using UnityEditor;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.U2D;
public class PlayerMovement : MonoBehaviour
{
[SerializeField]
private float movePower;
[SerializeField]
private float jumpPower;
[SerializeField]
[Range(0, 2)]
private float breakingPower;
[SerializeField]
private float maxSpeed;
public bool isJumping;
public bool isDoubleJumping;
public bool isDashing;
public bool isSliding;
public bool isWalking;
public bool isGrounded;
public bool shallJump;
public float direction; // float statt Vector2, weil wir nur links/rechts steuern wollen
private Rigidbody2D rb;
[SerializeField]
private ContactFilter2D contactFilter;
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
rb = GetComponent<Rigidbody2D>();
}
// Update is called once per frame
void FixedUpdate()
{
isGrounded = GroundCheck();
// Springen nur bei Bodenkontakt
if (isGrounded && shallJump)
{
rb.AddForce(Vector2.up * jumpPower, ForceMode2D.Impulse);
shallJump = false;
isGrounded = false;
}
// Bremsen, wenn Controller auf 0 oder in entgegengesetzte Richtung:
if ((direction <= 0.05f && direction > -0.05f))
//|| (rb.linearVelocity.x > 0f && direction < 0f)
//|| (rb.linearVelocity.x < 0f && direction > 0f))
{
if (breakingPower > 1f || breakingPower < 0f)
{
rb.linearVelocity = new Vector2(0f, rb.linearVelocityY);
}
else
{
rb.AddForce(new Vector2(-rb.linearVelocityX, 0f) * breakingPower * movePower, ForceMode2D.Force);
}
}
else
{
// Beschleunigen
rb.AddForce(Vector2.right * direction * movePower, ForceMode2D.Force);
// bis zu einer gewissen Geschwindigkeit
if (rb.linearVelocity.magnitude >= maxSpeed)
{
rb.linearVelocity = rb.linearVelocity.normalized * maxSpeed;
}
}
}
private bool GroundCheck()
{
return rb.IsTouching(contactFilter);
}
// wird von PlayerInput aufgerufen, wenn das auf "SendMessage" steht.
public void OnMove(InputValue value)
{
direction = value.Get<Vector2>().x; // nur rechts-links
if (direction > 0)
{
this.gameObject.transform.localScale = new Vector3(-1f, 1, 1); // sprite schaut entgegengesetzt
}
else if(direction < 0)
{
this.gameObject.transform.localScale = new Vector3(1f, 1, 1); // sprite schaut in seine normale Richtung
}
}
public void OnJump()
{
if (isGrounded)
{
shallJump = true;
}
}
}