125 lines
4.0 KiB
C#
125 lines
4.0 KiB
C#
using JetBrains.Annotations;
|
|
using System;
|
|
using UnityEngine;
|
|
using static UnityEngine.Rendering.DebugUI;
|
|
|
|
public class playerMovement : MonoBehaviour
|
|
{
|
|
|
|
private GroundCheck groundCheck; //Allows Use Of GroundCheck Script Variables
|
|
|
|
private Rigidbody2D body;
|
|
private BoxCollider2D hBox;
|
|
|
|
private bool allowedToMove = true, allowedToJump = true, doubleJumpUnlocked = true; //Unlocking & Locking Abilities
|
|
private bool isGrounded, canJumpAgain; //Physics Checks
|
|
private float CoyoteTimer, BufferTimer, airjumpTurnTimer, turnaround; //Timers & Calculation Variables
|
|
private float moveSpeed = 10f, groundJumpSpeed = 18f, airJumpSpeed = 14f, turnResponsiveness = 4f; //Physics Values
|
|
private float coyoteTimeAmount = .1f, airjumpTurnaroundTimeAmount = 1.5f, jumpBufferAmount = .2f; //Leniency Velues
|
|
|
|
private KeyCode hop = KeyCode.W, crouch = KeyCode.S, left = KeyCode.A, right = KeyCode.D; //Controls
|
|
|
|
|
|
void Start()
|
|
{
|
|
body = GetComponent<Rigidbody2D>();
|
|
hBox = transform.GetComponent<BoxCollider2D>();
|
|
body.gravityScale = 4;
|
|
}
|
|
|
|
void Update()
|
|
{
|
|
|
|
|
|
TimerHandler();
|
|
|
|
GroundCheck();
|
|
|
|
Movement();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void GroundCheck() {
|
|
|
|
groundCheck = GetComponentInChildren<GroundCheck>(); // Ground Check
|
|
isGrounded = groundCheck.isGrounded;
|
|
|
|
if (doubleJumpUnlocked && isGrounded) canJumpAgain = true; //Realoading Double Jump
|
|
|
|
} //Ground & Double Jump Checks
|
|
|
|
void TimerHandler()
|
|
{
|
|
if (isGrounded && !(body.linearVelocity.y > 0)) CoyoteTimer = coyoteTimeAmount; //Coyote Time
|
|
else CoyoteTimer -= Time.deltaTime;
|
|
|
|
if (Input.GetKeyDown(hop)) BufferTimer = jumpBufferAmount; //Jump Buffering
|
|
if (BufferTimer > 0) BufferTimer -= Time.deltaTime;
|
|
|
|
if (airjumpTurnTimer > 0) airjumpTurnTimer -= Time.deltaTime; //Double Jump Physics
|
|
} //Input Leniency & Special Input Time Windows
|
|
|
|
void Movement() {
|
|
|
|
if (allowedToMove)
|
|
{
|
|
if (!(Input.GetKey(left) && Input.GetKey(right)))
|
|
{
|
|
|
|
if (!isGrounded) turnaround = turnResponsiveness * .75f;
|
|
else turnaround = turnResponsiveness;
|
|
|
|
if (Input.GetKey(left))
|
|
{
|
|
body.linearVelocity += new Vector2(-moveSpeed * turnaround * Time.deltaTime, 0);
|
|
body.linearVelocity = new Vector2(Mathf.Clamp(body.linearVelocity.x, -moveSpeed, moveSpeed), body.linearVelocity.y);
|
|
}
|
|
|
|
if (Input.GetKey(right))
|
|
{
|
|
body.linearVelocity += new Vector2(moveSpeed * turnaround * Time.deltaTime, 0);
|
|
body.linearVelocity = new Vector2(Mathf.Clamp(body.linearVelocity.x, -moveSpeed, moveSpeed), body.linearVelocity.y);
|
|
}
|
|
} //Walking
|
|
|
|
if ( !(Input.GetKey(left) || Input.GetKey(right)) || (Input.GetKey(left) && Input.GetKey(right)))
|
|
{
|
|
body.linearVelocity = new Vector2(body.linearVelocity.x * .985f, body.linearVelocity.y);
|
|
} //Custom friction
|
|
} //Horizontal Movement & Physics
|
|
|
|
|
|
if (allowedToJump)
|
|
{
|
|
if ((CoyoteTimer > 0 && BufferTimer > 0))
|
|
{
|
|
body.linearVelocity = new Vector2(body.linearVelocity.x, groundJumpSpeed);
|
|
BufferTimer = 0;
|
|
CoyoteTimer = 0;
|
|
} //Normal jump is performed
|
|
|
|
|
|
else if (canJumpAgain && Input.GetKeyDown(hop))
|
|
{
|
|
body.linearVelocity = new Vector2(body.linearVelocity.x, airJumpSpeed);
|
|
canJumpAgain = false;
|
|
|
|
airjumpTurnTimer = airjumpTurnaroundTimeAmount;
|
|
} //Air jump is performed
|
|
|
|
|
|
if (!Input.GetKey(hop) && body.linearVelocity.y > 0)
|
|
{
|
|
body.linearVelocity = new Vector2(body.linearVelocity.x, body.linearVelocity.y * .92f);
|
|
} //Jump Released
|
|
|
|
} //Vertical Movement & Physics
|
|
|
|
} //Check Player Input
|
|
}
|