using UnityEngine; [RequireComponent(typeof(CharacterController))] public class PlayerMovement : MonoBehaviour { [Header("Movement Settings")] [SerializeField] private float moveSpeed = 4f; [SerializeField] private float gravity = -9.81f; [Header("Ground Check")] [SerializeField] private Transform groundCheck; [SerializeField] private float groundDistance = 0.4f; [SerializeField] private LayerMask groundMask; private CharacterController controller; private Vector3 velocity; private bool isGrounded; private void Awake() { controller = GetComponent(); } public void ProcessMove(Vector2 input) { // Проверка касания земли (сфера на уровне ног) isGrounded = Physics.CheckSphere(groundCheck.position, groundDistance, groundMask); if (isGrounded && velocity.y < 0) { velocity.y = -2f; // Небольшое прижатие к земле для стабильного спуска по склонам } // Движение относительно локальных координат игрока Vector3 move = transform.right * input.x + transform.forward * input.y; controller.Move(move * (moveSpeed * Time.deltaTime)); // Применение гравитации velocity.y += gravity * Time.deltaTime; controller.Move(velocity * Time.deltaTime); } }