using UnityEngine;
[RequireComponent(typeof(CharacterController))]
public class PlayerController : MonoBehaviour
{
[Header("Movement")]
public float moveSpeed = 6f;
public float gravity = -20f;
[Header("Jump")]
public float jumpHeight = 2f;
public int maxJumps = 3; // 2 = двойной, 3 = тройной
[Header("Sliding")]
public float slideSpeed = 12f;
[Header("Camera")]
public Transform cameraTransform;
public Vector3 cameraOffset = new Vector3(0, 5, -7);
public float cameraSmooth = 5f;
private CharacterController controller;
private Vector3 velocity;
private int jumpCount;
private bool isSliding;
void Start()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
Move();
Jump();
ApplyGravity();
CameraFollow();
}
void Move()
{
float x = Input.GetAxis("Horizontal");
float z = Input.GetAxis("Vertical");
Vector3 move = transform.right * x + transform.forward * z;
float currentSpeed = isSliding ? slideSpeed : moveSpeed;
controller.Move(move * currentSpeed * Time.deltaTime);
}
void Jump()
{
if (controller.isGrounded)
{
velocity.y = -2f;
jumpCount = 0;
}
if (Input.GetButtonDown("Jump") && jumpCount < maxJumps)
{
velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity);
jumpCount++;
}
}
void ApplyGravity()
{
velocity.y += gravity * Time.deltaTime;
controller.Move(velocity * Time.deltaTime);
}
void CameraFollow()
{
if (cameraTransform == null)
return;
Vector3 targetPosition = transform.position + cameraOffset;
cameraTransform.position = Vector3.Lerp(
cameraTransform.position,
targetPosition,
cameraSmooth * Time.deltaTime
);
cameraTransform.LookAt(transform);
}
private void OnControllerColliderHit(ControllerColliderHit hit)
{
if (hit.gameObject.CompareTag("SlidePlatform"))
{
isSliding = true;
}
else
{
isSliding = false;
}
}
}