using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerMovement : MonoBehaviour { private float horizontal; private float speed = 6f; private float jumpingPower = 6.5f; private float DoublejumpingPower = 5.5f; public float fallMultiplier = 3.5f; public float lowJumpMultiplier = 2f; private bool isFacingRight = true; private bool isWallSliding; private float wallSlidingSpeed = 2f; private bool isWallJumping; private float wallJumpingDirection; private float wallJumpingTime = 0.2f; private float wallJumpingCounter; private float wallJumpingDuration = 0.4f; private float wallJumps = 0f; private Vector2 wallJumpingPower = new Vector2(4f, 6f); [SerializeField] private Rigidbody2D rb; [SerializeField] private Transform groundCheck; [SerializeField] private LayerMask groundLayer; [SerializeField] private Transform wallCheck; [SerializeField] private LayerMask wallLayer; [SerializeField] bool DoubleJumpReady; private void Update() { if (rb.velocity.y < 0) { rb.velocity += Vector2.up * Physics2D.gravity.y * (fallMultiplier - 1) * Time.deltaTime; } else if (rb.velocity.y > 0 && !Input.GetButton("Jump")) { rb.velocity += Vector2.up * Physics2D.gravity.y * (lowJumpMultiplier - 1) * Time.deltaTime; } horizontal = Input.GetAxisRaw("Horizontal"); if (Input.GetButtonDown("Jump") && IsGrounded()) { rb.velocity = new Vector2(rb.velocity.x, jumpingPower); } else if (Input.GetButtonDown("Jump") && DoubleJumpReady) { rb.velocity = new Vector2(rb.velocity.x, DoublejumpingPower); DoubleJumpReady = false; } if (Input.GetButtonUp("Jump") && rb.velocity.y > 0f) { rb.velocity = new Vector2(rb.velocity.x, rb.velocity.y * 0.5f); } WallSlide(); WallJump(); if (!isWallJumping) { Flip(); } if (!IsGrounded()) { speed = 5f; } if (IsGrounded()) { speed = 6f; wallJumps = 0f; DoubleJumpReady = true; } } private void FixedUpdate() { if (!isWallJumping) { rb.velocity = new Vector2(horizontal * speed, rb.velocity.y); } } private bool IsGrounded() { return Physics2D.OverlapCircle(groundCheck.position, 0.2f, groundLayer); } private bool IsWalled() { return Physics2D.OverlapCircle(wallCheck.position, 0.2f, wallLayer); } private void WallSlide() { if (IsWalled() && !IsGrounded() && horizontal != 0f) { isWallSliding = true; rb.velocity = new Vector2(rb.velocity.x, Mathf.Clamp(rb.velocity.y, -wallSlidingSpeed, float.MaxValue)); } else { isWallSliding = false; } } private void WallHold() { if (IsWalled() && !IsGrounded() && horizontal == 0f) { rb.velocity = new Vector2(rb.velocity.x, Mathf.Clamp(rb.velocity.y, -wallSlidingSpeed, float.MaxValue)); } else { isWallSliding = false; } } private void WallJump() { if (isWallSliding) { isWallJumping = false; wallJumpingDirection = -transform.localScale.x; wallJumpingCounter = wallJumpingTime; CancelInvoke(nameof(StopWallJumping)); } else { wallJumpingCounter -= Time.deltaTime; } if (Input.GetButtonDown("Jump") && wallJumpingCounter > 0f && wallJumps < 4f) { wallJumps++; isWallJumping = true; rb.velocity = new Vector2(wallJumpingDirection * wallJumpingPower.x, wallJumpingPower.y); wallJumpingCounter = 0f; if (transform.localScale.x != wallJumpingDirection) { isFacingRight = !isFacingRight; Vector3 localScale = transform.localScale; localScale.x *= -1f; transform.localScale = localScale; } Invoke(nameof(StopWallJumping), wallJumpingDuration); } } private void StopWallJumping() { isWallJumping = false; } private void Flip() { if (isFacingRight && horizontal < 0f || !isFacingRight && horizontal > 0f) { isFacingRight = !isFacingRight; Vector3 localScale = transform.localScale; localScale.x *= -1f; transform.localScale = localScale; } } }