Untitled
unknown
plain_text
2 years ago
4.4 kB
14
Indexable
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
private float horizontal;
[SerializeField] private float speed = 8f;
[SerializeField] private float jumpingPower = 16f;
private bool isFacingRight = true;
[SerializeField] private float coyoteTime = 0.3f;
private float coyoteTimeCounter;
[SerializeField] private float jumpBufferTime = 0.2f;
private float jumpBufferCounter;
private bool canDash = true;
private bool isDashing;
private Animator anim;
private SpriteRenderer sprite;
[SerializeField] private float dashingPower = 24f;
[SerializeField] private float dashingTime = 0.2f;
[SerializeField] private float dashingCooldown = 1f;
[SerializeField] private AudioSource jumpsfx;
[SerializeField] private AudioSource dashsfx;
[SerializeField] private Rigidbody2D rb;
[SerializeField] private Transform groundCheck;
[SerializeField] private LayerMask groundLayer;
[SerializeField] private TrailRenderer tr;
private enum MovementState { idle, running, jumping }
private float dirX = 0f;
private void Start()
{
sprite = GetComponent<SpriteRenderer>();
anim = GetComponent<Animator>();
}
void Update()
{
horizontal = Input.GetAxisRaw("Horizontal");
if (IsGrounded())
{
coyoteTimeCounter = coyoteTime;
}
else
{
coyoteTimeCounter -= Time.deltaTime;
}
if (Input.GetButtonDown("Jump"))
{
jumpBufferCounter = jumpBufferTime;
}
else
{
jumpBufferCounter -= Time.deltaTime;
}
if (isDashing)
{
return;
}
if (coyoteTimeCounter > 0f && jumpBufferCounter > 0f )
{
rb.velocity = new Vector2(rb.velocity.x, jumpingPower);
jumpsfx.Play();
jumpBufferCounter = 0f;
}
if (Input.GetButtonUp("Jump") && rb.velocity.y > 0f)
{
rb.velocity = new Vector2(rb.velocity.x, rb.velocity.y * 0.5f);
coyoteTimeCounter = 0f;
}
if (Input.GetKeyDown(KeyCode.UpArrow) && rb.velocity.y > 0f)
{
rb.velocity = new Vector2(rb.velocity.x, jumpingPower);
jumpsfx.Play();
coyoteTimeCounter = 0f;
}
if (Input.GetKeyDown(KeyCode.LeftShift) && canDash)
{
StartCoroutine(Dash());
dashsfx.Play();
}
UpdateAnimationState();
Flip();
}
private void UpdateAnimationState()
{
MovementState state;
if (dirX > 0f)
{
state = MovementState.running;
}
else if (dirX < 0f)
{
state = MovementState.running;
}
else
{
state = MovementState.idle;
}
if (rb.velocity.y > .1f)
{
state = MovementState.jumping;
}
anim.SetInteger("state", (int)state);
}
private void FixedUpdate()
{
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 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;
}
}
Editor is loading...