2023-05-21 14:22:14 +02:00

100 lines
2.8 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CharController : MonoBehaviour
{
public float maxSpeed = 3.4f;
public float jumpHeight = 6.5f;
public float gravityScale = 1.5f;
public Camera mainCamera;
bool facingRight = true;
public bool grounded = false;
Vector3 cameraPos;
float moveDirection = 0;
Rigidbody2D rb;
CapsuleCollider2D mainCollider;
CapsuleCollider2D friction;
Transform t;
// Start is called before the first frame update
void Start()
{
t = transform;
rb = GetComponent<Rigidbody2D>();
mainCollider = GetComponent<CapsuleCollider2D>();
friction = GetComponent<CapsuleCollider2D>();
rb.freezeRotation = true;
rb.gravityScale = gravityScale;
if(mainCamera)
{
cameraPos = mainCamera.transform.position;
}
}
// Update is called once per frame
void Update()
{
//if(grounded || Mathf.Abs(rb.velocity.x) > 0.01f)
moveDirection = Input.GetAxisRaw("Horizontal");
if(moveDirection != 0)
{
if (moveDirection > 0 && !facingRight)
{
facingRight = true;
t.localScale = new Vector3(Mathf.Abs(t.localScale.x), t.localScale.y, transform.localScale.z);
}
if (moveDirection < 0 && facingRight)
{
facingRight = false;
t.localScale = new Vector3(-Mathf.Abs(t.localScale.x), t.localScale.y, t.localScale.z);
}
}
if(Input.GetButtonDown("Jump") && grounded)
{
rb.velocity = new Vector2(rb.velocity.x, jumpHeight);
}
if (mainCamera)
{
mainCamera.transform.position = new Vector3(t.position.x, t.position.y, cameraPos.z);
}
}
void FixedUpdate()
{
Bounds colliderBounds = mainCollider.bounds;
float colliderRadius = mainCollider.size.x * 0.4f * Mathf.Abs(transform.localScale.x);
Vector3 groundCheckPos = colliderBounds.min + new Vector3(colliderBounds.size.x * 0.5f, colliderRadius * 0.9f, 0);
Collider2D[] colliders = Physics2D.OverlapCircleAll(groundCheckPos, colliderRadius);
grounded = false;
if (colliders.Length > 2)
{
foreach (Collider2D hit in colliders){
if (hit != mainCollider){
grounded = true;
break;
}
}
}
rb.velocity = new Vector2(moveDirection * maxSpeed, rb.velocity.y);
Debug.DrawLine(groundCheckPos, groundCheckPos - new Vector3(0, colliderRadius, 0), grounded ? Color.green : Color.red);
Debug.DrawLine(groundCheckPos, groundCheckPos - new Vector3(colliderRadius, 0, 0), grounded ? Color.green : Color.red);
}
}