using Obstacle; using UnityEngine; namespace Player { [RequireComponent(typeof(Rigidbody))] public class PlayerCarController : MonoBehaviour { [Header("Скорость движения")] public float forwardSpeed = 20f; public float sideSpeed = 15f; public float horizontalLimit = 4.5f; [Header("Управление")] public float swipeSensitivity = 1.5f; [Header("Визуальный наклон ")] [Tooltip("На сколько градусов поворачивается нос машины при перестроении")] public float maxTiltAngle = 15f; [Tooltip("Как быстро машина выравнивается обратно")] public float tiltSpeed = 10f; private Rigidbody _rb; private bool _isAlive = true; private float _targetX; private Vector2 _lastInputPosition; void Start() { _rb = GetComponent(); _isAlive = true; _targetX = transform.position.x; } void Update() { if (!_isAlive) return; if (Input.GetMouseButtonDown(0)) { _lastInputPosition = Input.mousePosition; } else if (Input.GetMouseButton(0)) { float deltaX = Input.mousePosition.x - _lastInputPosition.x; _lastInputPosition = Input.mousePosition; // Сдвигаем целевую точку X _targetX += (deltaX / Screen.width) * swipeSensitivity * 10f; _targetX = Mathf.Clamp(_targetX, -horizontalLimit, horizontalLimit); } } void FixedUpdate() { if (!_isAlive) return; Vector3 currentPos = _rb.position; float newX = Mathf.MoveTowards(currentPos.x, _targetX, sideSpeed * Time.fixedDeltaTime); Vector3 moveTarget = new Vector3(newX, currentPos.y, currentPos.z + forwardSpeed * Time.fixedDeltaTime); _rb.MovePosition(moveTarget); float deltaX = newX - currentPos.x; float direction = deltaX / (sideSpeed * Time.fixedDeltaTime); // Поворачиваем нос машины в сторону движения Quaternion targetRotation = Quaternion.Euler(0, direction * maxTiltAngle, 0); _rb.MoveRotation(Quaternion.Lerp(_rb.rotation, targetRotation, tiltSpeed * Time.fixedDeltaTime)); } private void OnCollisionEnter(Collision collision) { if (!_isAlive) return; if (collision.gameObject.GetComponent() != null || collision.gameObject.GetComponent() != null) { _isAlive = false; GameEvents.OnPlayerDied?.Invoke(); } } } }