Advertisement
Guest User

Untitled

a guest
Nov 29th, 2021
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.12 KB | None | 0 0
  1. using UnityEngine;
  2.  
  3. public class CameraController : MonoBehaviour
  4. {
  5.     [SerializeField] private float _dragSpeed;
  6.     [SerializeField] private float _zoomSpeed;
  7.     [SerializeField] private float _maxY;
  8.     [SerializeField] private float _minY;
  9.  
  10.     private int _touchCount;
  11.     private float _lastZoomDistance;
  12.     private Vector2 _lastDragPosition;
  13.     private bool _endedThisFrame;
  14.  
  15.     private void Update()
  16.     {
  17.         _touchCount = Input.touchCount;
  18.         if (_touchCount != 1 && _touchCount != 2) return;
  19.  
  20.         ProcessTouch();
  21.  
  22.         if (_touchCount == 1)
  23.             Drag();
  24.         else
  25.             Zoom();
  26.     }
  27.  
  28.     private void ProcessTouch()
  29.     {
  30.         for (int i = 0; i < _touchCount; i++)
  31.         {
  32.             var touch = Input.GetTouch(i);
  33.             if (touch.phase != TouchPhase.Began && touch.phase != TouchPhase.Ended) continue;
  34.  
  35.             _endedThisFrame = touch.phase == TouchPhase.Ended; // убрать дергание drag при поднятии второго пальца
  36.  
  37.             if (_touchCount == 2)
  38.                 _lastZoomDistance = Vector3.Distance(Input.GetTouch(0).position, Input.GetTouch(1).position);
  39.             else
  40.                 _lastDragPosition = Input.GetTouch(0).position;
  41.         }
  42.     }
  43.  
  44.     private void Drag()
  45.     {
  46.         if (_endedThisFrame) return;
  47.         var touchPos = Input.GetTouch(0).position;
  48.         var dragDelta = touchPos - _lastDragPosition;
  49.         var camFwd = Vector3.ProjectOnPlane(transform.forward, Vector3.up).normalized;
  50.         var camRight = transform.right;
  51.         var translation = camFwd * dragDelta.y + camRight * dragDelta.x;
  52.  
  53.         transform.Translate(translation * _dragSpeed * Time.deltaTime, Space.World);
  54.  
  55.         _lastDragPosition = touchPos;
  56.     }
  57.  
  58.     private void Zoom()
  59.     {
  60.         var zoomDistance = Vector3.Distance(Input.GetTouch(0).position, Input.GetTouch(1).position);
  61.         var zoomDelta = zoomDistance - _lastZoomDistance;
  62.         _lastZoomDistance = zoomDistance;
  63.  
  64.         if (Mathf.Approximately(transform.position.y, _minY) && zoomDelta > 0 ||
  65.             Mathf.Approximately(transform.position.y, _maxY) && zoomDelta < 0) return;
  66.  
  67.         transform.Translate(transform.forward * zoomDelta * _zoomSpeed * Time.deltaTime, Space.World);
  68.         var pos = transform.position;
  69.         pos.y = Mathf.Clamp(pos.y, _minY, _maxY);
  70.         transform.position = pos;
  71.     }
  72. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement