January 18, 2025
Kinda proud of this 2D player movement
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
public float acceleration;
public float speed;
public float frictionCoefficient;
private Rigidbody2D rb;
private Vector2 input;
private Vector2 boundingMin, boundingMax;
private Vector2 spriteMargin;
private SpriteRenderer spriteRenderer;
public float edgeBouncebackForce;
void Start()
{
rb = GetComponent();
spriteRenderer = GetComponent();
spriteMargin = new Vector2(spriteRenderer.bounds.size.x / 2, spriteRenderer.bounds.size.y / 2);
boundingMin = Camera.main.ScreenToWorldPoint(Vector2.zero);
boundingMax = Camera.main.ScreenToWorldPoint(new Vector2(Screen.width, Screen.height));
boundingMin.x += spriteMargin.x;
boundingMin.y += spriteMargin.y;
boundingMax.x -= spriteMargin.x;
boundingMax.y -= spriteMargin.y;
}
void Update()
{
input = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));
if(transform.position.x == boundingMin.x || transform.position.x == boundingMax.x) rb.AddForce(Vector2.right * -rb.velocity.x * edgeBouncebackForce, ForceMode2D.Impulse);
if(transform.position.y == boundingMin.y || transform.position.y == boundingMax.y) rb.AddForce(Vector2.up * -rb.velocity.y * edgeBouncebackForce, ForceMode2D.Impulse);
transform.position = new Vector2(Mathf.Clamp(transform.position.x, boundingMin.x, boundingMax.x), Mathf.Clamp(transform.position.y, boundingMin.y, boundingMax.y));
}
void FixedUpdate()
{
rb.AddForce(input * acceleration, ForceMode2D.Force);
rb.velocity = Vector2.ClampMagnitude(rb.velocity, speed);
rb.AddForce(-rb.velocity * frictionCoefficient, ForceMode2D.Impulse);
}
}