using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
[Header("-----------GroundMovements-----------")]
public float SpeedForce;
public float JumpForce;
[SerializeField] private LayerMask GroundLayer;
[SerializeField] private Transform groundCheck;
private bool isGrounded;
private bool isFacingRight = true;
private int facingDirection = 1; // 1 = facing right // -1= facing left
[Header("-----------WallMovements-----------")]
private bool isWallSliding;
private bool isOnWall;
[SerializeField] private Transform wallCheck;
public float SlidingSpeed;
[SerializeField] Vector2 wallJumpDirection;
private float HorizontalInput;
private Rigidbody2D rb;
private Animator anim;
private float coyoteTime;
void Start()
{
anim = GetComponent<Animator>();
rb = GetComponent<Rigidbody2D>();
}
void Update()
{
HorizontalInput = Input.GetAxisRaw("Horizontal");
CheckInput();
wallSliding();
run();
Collisions();
anim.SetBool("IsGrounded", isGrounded);
}
//_____________________________________________________________________________________________________________________________________
private void Collisions()
{
isGrounded = Physics2D.OverlapBox(groundCheck.position, new Vector2(0.17f, 0.015f), 0, GroundLayer);
isOnWall = Physics2D.OverlapBox(wallCheck.position, new Vector2(0.01f, 0.17f), 0, GroundLayer);
}
//_____________________________________________________________________________________________________________________________________
private void CheckInput()
{
if (isGrounded)
{
coyoteTime = 0.16f;
}
else
{
coyoteTime -= Time.deltaTime;
}
//check if space is pressed
if (Input.GetKeyDown(KeyCode.Space))
{
Jump();
}
}
//_____________________________________________________________________________________________________________________________________
private void Jump()
{
//NormalJump
if (coyoteTime > 0f)
{
rb.velocity = new Vector2(rb.velocity.x, JumpForce);
anim.SetTrigger("Jump");
}
//WallJump
else if (isWallSliding)
{
rb.velocity = new Vector2(wallJumpDirection.x * -facingDirection, wallJumpDirection.y);
}
}
//_____________________________________________________________________________________________________________________________________
private void wallSliding()
{
if (isOnWall && !isGrounded && rb.velocity.y < 0f)
{
isWallSliding = true;
if (HorizontalInput > 0.01f)
{
anim.SetBool("OnRightWall", true);
}
else if (HorizontalInput < -0.01f)
{
anim.SetBool("LeftWall", true);
}
rb.velocity = new Vector2(rb.velocity.x, Mathf.Clamp(rb.velocity.y, -SlidingSpeed, float.MaxValue));
}
else
{
isWallSliding = false;
rb.velocity = new Vector2(HorizontalInput * SpeedForce, rb.velocity.y);
anim.SetBool("OnRightWall", false);
anim.SetBool("LeftWall", false);
}
}
//_____________________________________________________________________________________________________________________________________
private void run()
{
//these ifs orient the player where he is looking
if (HorizontalInput > 0.01f && !isFacingRight)
{
flip();
anim.SetBool("run1", true);
anim.SetBool("run2", false);
}
else if (HorizontalInput < -0.01f && isFacingRight)
{
flip();
anim.SetBool("run2", true);
anim.SetBool("run1", false);
}
else if (HorizontalInput == 0f)
{
anim.SetBool("run2", false);
anim.SetBool("run1", false);
}
rb.velocity = new Vector2(HorizontalInput * SpeedForce, rb.velocity.y);
}
//_____________________________________________________________________________________________________________________________________
private void flip()
{
facingDirection *= -1;
isFacingRight = !isFacingRight;
transform.Rotate(0, 180, 0);
}
//_____________________________________________________________________________________________________________________________________
}