124 lines
3.6 KiB
C#
124 lines
3.6 KiB
C#
using UnityEngine;
|
|
using UnityEngine.InputSystem;
|
|
|
|
public class PlayerMovement : MonoBehaviour
|
|
{
|
|
private Rigidbody2D rb;
|
|
|
|
public float maxRunSpeed;
|
|
public float runAcceleration;
|
|
public float snappiness = 1;
|
|
public float jumpSpeed;
|
|
[Range(0,1)] public float airSpeedMultiplier;
|
|
private bool onGround = false;
|
|
private float forward = 1;
|
|
|
|
float hangTimeThreshold = 0.1f;
|
|
float hangTimeAccel = 0;
|
|
float hangTimeSpeed = 0;
|
|
|
|
private Vector2 movement = Vector2.zero;
|
|
|
|
public LayerMask groundLayer;
|
|
public Vector2 boxSize;
|
|
public float maxDistanceFromGround;
|
|
|
|
[Header("State Control:")]
|
|
[SerializeField] private StateController stateController;
|
|
|
|
PlayerBehavior playerBehavior;
|
|
|
|
void OnValidate()
|
|
{
|
|
this.runAcceleration = Mathf.Clamp(runAcceleration, 0.1f, this.maxRunSpeed);
|
|
}
|
|
|
|
void Start()
|
|
{
|
|
playerBehavior = this.gameObject.GetComponent<PlayerBehavior>();
|
|
this.rb = this.GetComponent<Rigidbody2D>();
|
|
stateController = GameObject.Find("StateController").GetComponent<StateController>();
|
|
}
|
|
|
|
void OnMove(InputValue value)
|
|
{
|
|
this.movement = value.Get<Vector2>();
|
|
//Debug.Log(this.movement);
|
|
}
|
|
|
|
void OnJump() {
|
|
if (IsGrounded()) {
|
|
rb.AddForce(Vector2.up * jumpSpeed, ForceMode2D.Impulse);
|
|
}
|
|
}
|
|
|
|
void FixedUpdate()
|
|
{
|
|
Run(1);
|
|
}
|
|
|
|
float AccelerationRate()
|
|
{
|
|
return this.runAcceleration / this.maxRunSpeed;
|
|
}
|
|
|
|
private void Run(float lerpAmount)
|
|
{
|
|
float targetSpeed = this.movement.x * this.maxRunSpeed;
|
|
|
|
float speedDiff = targetSpeed - this.rb.velocity.x;
|
|
forward = Mathf.Sign(speedDiff);
|
|
|
|
float accel = AccelerationRate() * snappiness;
|
|
|
|
float accelRate = (Mathf.Abs(targetSpeed) > 0.1) ? accel : -accel;
|
|
|
|
float velPower = 1.0f;
|
|
|
|
float move = Mathf.Pow(Mathf.Abs(speedDiff) * accelRate, velPower) * forward;
|
|
|
|
this.onGround = IsGrounded();
|
|
|
|
float frictionAmount = 0.5f;
|
|
|
|
// accelerate
|
|
if (onGround && (Mathf.Abs(this.movement.x) > 0.1f)) { // regular acceleration
|
|
this.rb.AddForce(move * Vector2.right, ForceMode2D.Force);
|
|
} else if (!onGround && (Mathf.Abs(this.movement.x) > 0.1f) && !playerBehavior.grapplingRope.isGrappling) { // while in air
|
|
this.rb.AddForce(move * Vector2.right * airSpeedMultiplier, ForceMode2D.Force);
|
|
} else if (!playerBehavior.grapplingRope.isGrappling) { // while grappling
|
|
this.rb.AddForce(move * Vector2.right * airSpeedMultiplier * airSpeedMultiplier, ForceMode2D.Force);
|
|
}
|
|
|
|
// decelerate until stopped
|
|
if (onGround && Mathf.Abs(this.movement.x) < 0.1f)
|
|
{
|
|
if (Mathf.Abs(rb.velocity.x) > 0.1f) {
|
|
float amount = Mathf.Min(
|
|
Mathf.Abs(this.rb.velocity.x),
|
|
Mathf.Abs(frictionAmount)
|
|
);
|
|
amount *= Mathf.Sign(this.rb.velocity.x);
|
|
this.rb.AddForce(-amount * Vector2.right * snappiness, ForceMode2D.Impulse);
|
|
} else {
|
|
this.rb.velocity = new Vector2(0, rb.velocity.y);
|
|
}
|
|
}
|
|
}
|
|
|
|
bool IsGrounded()
|
|
{
|
|
if (Physics2D.BoxCast(transform.position, boxSize, 0, -transform.up, maxDistanceFromGround, groundLayer))
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void OnDrawGizmos()
|
|
{
|
|
Gizmos.color = Color.red;
|
|
Gizmos.DrawCube(transform.position - transform.up * maxDistanceFromGround, boxSize);
|
|
}
|
|
}
|