using System.Collections; using System.Collections.Generic; using UnityEngine; public class NewMovement : MonoBehaviour { public Animator animator; private float horizontal; private float speed = 10f; public float jumpingPower; private bool isFacingRight = true; private bool isWallSliding; public float wallSlidingSpeed = 2f; private bool isWallJumping; private float wallJumpingDirection; public float wallJumpingTime = 0.2f; private float wallJumpingCounter; public float wallJumpingDuration = 0.4f; public Vector2 wallJumpingPower = new Vector2(8f, 16f); private bool canDash = true; private bool isDashing; public float dashingPower = 24f; public float dashingTime = 0.2f; private float dashingCooldown = 1f; [SerializeField] private Rigidbody2D rb; [SerializeField] private Transform groundCheck; [SerializeField] private LayerMask groundLayer; [SerializeField] private TrailRenderer tr; [SerializeField] private Transform wallCheck; [SerializeField] private LayerMask wallLayer; // Update is called once per frame void Update() { if (isDashing) { return; } horizontal = Input.GetAxisRaw("Horizontal"); animator.SetFloat("Speed", Mathf.Abs(horizontal)); if (Input.GetButtonDown("Jump") && IsGrounded()) { rb.velocity = new Vector2(rb.velocity.x, jumpingPower); animator.SetBool("isJumping", true); } if (Input.GetButtonUp("Jump") && rb.velocity.y > 0f) { rb.velocity = new Vector2(rb.velocity.x, rb.velocity.y * 0.5f); } if (Input.GetButtonUp("Jump") && !IsGrounded()) { animator.SetBool("isJumping", false); animator.SetBool("isFalling", true); } if (Input.GetButtonUp("Jump") && IsGrounded()) { animator.SetBool("isJumping", false); } if (IsGrounded()) { animator.SetBool("isFalling", false); } if (Input.GetButtonDown("Jump") && IsWalled()) { animator.SetBool("isJumping", true); animator.SetBool("isSliding", false); } if (animator.GetBool("isSliding")) { animator.SetBool("isJumping", false); } if (Input.GetKeyDown(KeyCode.LeftShift) && canDash) { StartCoroutine(Dash()); } WallSlide(); WallJump(); if (!isWallJumping) { Flip(); } } private void FixedUpdate() { if (!isWallJumping) { if (isDashing) { return; } rb.velocity = new Vector2(horizontal * speed, rb.velocity.y); } } private bool IsGrounded() { return Physics2D.OverlapCircle(groundCheck.position, 0.2f, groundLayer); } 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)); animator.SetBool("isSliding", true); animator.SetBool("isFalling", false); } else { isWallSliding = false; animator.SetBool("isSliding", 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) { isWallJumping = true; rb.velocity = new Vector2(wallJumpingDirection * wallJumpingPower.x, wallJumpingPower.y); wallJumpingCounter = 0f; animator.SetBool("isJumping", true); 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 bool IsWalled() { return Physics2D.OverlapCircle(wallCheck.position, 0.2f, wallLayer); } private void Flip() { if(isFacingRight && horizontal < 0f || !isFacingRight && horizontal >0f) { isFacingRight = !isFacingRight; Vector3 localScale = transform.localScale; localScale.x *= -1f; transform.localScale = localScale; } } private IEnumerator Dash() { canDash = false; isDashing = true; float originalGravity = rb.gravityScale; rb.gravityScale = 0f; rb.velocity = new Vector2(transform.localScale.x * dashingPower, 0f); tr.emitting = true; yield return new WaitForSeconds(dashingTime); tr.emitting = false; rb.gravityScale += originalGravity; isDashing = false; yield return new WaitForSeconds(dashingCooldown); canDash = true; } }