using UnityEngine; public class Paddle : MonoBehaviour { public float moveSpeed = 10f; public float boundaryOffset = 0.5f; public float launchInfluence = 0.7f; // How much paddle movement affects ball launch public float bounceInfluence = 1.2f; // How much paddle movement affects bounce private float screenHalfWidth; private float paddleHalfWidth; private Camera mainCamera; private Vector3 lastPosition; private Vector2 currentVelocity; private bool isTouching = false; private float touchStartX; private float paddleStartX; private bool isMobile; void Start() { mainCamera = Camera.main; paddleHalfWidth = transform.localScale.x / 2f; screenHalfWidth = mainCamera.aspect * mainCamera.orthographicSize; lastPosition = transform.position; // Определяем, запущено ли на мобильном устройстве isMobile = Application.isMobilePlatform; } void Update() { if (isMobile) { HandleTouchInput(); } else { HandleDesktopInput(); } // Calculate current velocity currentVelocity = (transform.position - lastPosition) / Time.deltaTime; lastPosition = transform.position; } private void HandleTouchInput() { if (Input.touchCount > 0) { Touch touch = Input.GetTouch(0); switch (touch.phase) { case TouchPhase.Began: isTouching = true; touchStartX = touch.position.x; paddleStartX = transform.position.x; break; case TouchPhase.Moved: case TouchPhase.Stationary: if (isTouching) { // Вычисляем смещение в пикселях float touchDelta = touch.position.x - touchStartX; // Конвертируем в мировые координаты float worldDelta = (touchDelta / Screen.width) * (screenHalfWidth * 2); // Вычисляем новую позицию float newX = Mathf.Clamp(paddleStartX + worldDelta, -screenHalfWidth + paddleHalfWidth + boundaryOffset, screenHalfWidth - paddleHalfWidth - boundaryOffset); // Плавно перемещаем к целевой позиции float currentX = transform.position.x; newX = Mathf.MoveTowards(currentX, newX, moveSpeed * Time.deltaTime); // Применяем позицию transform.position = new Vector3(newX, transform.position.y, transform.position.z); } break; case TouchPhase.Ended: case TouchPhase.Canceled: isTouching = false; break; } } } private void HandleDesktopInput() { // Get input float moveInput = Input.GetAxis("Horizontal"); // Calculate new position Vector3 pos = transform.position; pos.x += moveInput * moveSpeed * Time.deltaTime; // Clamp position to screen bounds float clampedX = Mathf.Clamp(pos.x, -screenHalfWidth + paddleHalfWidth + boundaryOffset, screenHalfWidth - paddleHalfWidth - boundaryOffset); // Update position transform.position = new Vector3(clampedX, pos.y, pos.z); } public Vector2 GetCurrentVelocity() { return currentVelocity; } public Vector2 GetLaunchVelocity() { return currentVelocity * launchInfluence; } public Vector2 GetBounceVelocity() { return currentVelocity * bounceInfluence; } }