using UnityEngine;
public class PlayerSlide : MonoBehaviour
{
public bool IsSliding { get { return isSliding; } }
// Slide-related variables
private bool isSliding = false;
private PlayerMovement playerMovement;
[SerializeField] private float slideSpeed = 3f;
[SerializeField] private float slideDuration = 0.3f;
[SerializeField] private float slideGravityScale = 3f;
[SerializeField] private float normalGravityScale = 2f;
[SerializeField] private PhysicsMaterial2D slidePhysicsMaterial; // Assign in Inspector
[SerializeField] private PhysicsMaterial2D normalPhysicsMaterial; // Assign in Inspector
[SerializeField] private Rigidbody2D rb; // Assign in Inspector
[SerializeField] private BoxCollider2D playerCollider; // Assign in Inspector
[SerializeField] private Transform groundCheck; // Assign in Inspector
[SerializeField] private LayerMask groundLayer; // Assign in Inspector
void start()
{
playerMovement = GetComponent<PlayerMovement>();
}
void Update()
{
// Check for slide input using the S key (or add alternate bindings in Input Manager)
if (Input.GetKeyDown(KeyCode.S) && IsGrounded())
{
StartSlide();
}
}
private bool IsGrounded()
{
return Physics2D.OverlapCircle(groundCheck.position, 0.3f, groundLayer);
}
private void StartSlide()
{
if (!isSliding && IsGrounded())
{
isSliding = true;
// Disable the PlayerMovement script
if (playerMovement != null)
playerMovement.enabled = false;
Debug.Log("Slide initiated! Normal Gravity: " + rb.gravityScale);
// Boost player speed forward (using the current facing direction)
rb.linearVelocity = new Vector2(transform.localScale.x * slideSpeed, rb.linearVelocity.y);
// Set slide physics material to reduce friction
rb.sharedMaterial = slidePhysicsMaterial;
// Increase gravity during slide so the player stays close to the ground
rb.gravityScale = slideGravityScale;
Debug.Log("Slide Gravity set to: " + rb.gravityScale);
// Stop the slide after a duration
Invoke(nameof(StopSlide), slideDuration);
}
}
private void StopSlide()
{
isSliding = false;
// Reset physics material to normal friction
rb.sharedMaterial = normalPhysicsMaterial;
// Toggle collider to refresh it
playerCollider.enabled = false;
playerCollider.enabled = true;
// Reset gravity to normal
rb.gravityScale = normalGravityScale;
rb.WakeUp();
// Re-enable the PlayerMovement script
if (playerMovement != null)
playerMovement.enabled = true;
Debug.Log("Slide ended. Gravity reset to: " + rb.gravityScale);
}
}