Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using UnityEngine;
- public class CameraController : MonoBehaviour
- {
- [SerializeField] private float _dragSpeed;
- [SerializeField] private float _zoomSpeed;
- [SerializeField] private float _maxY;
- [SerializeField] private float _minY;
- private int _touchCount;
- private float _lastZoomDistance;
- private Vector2 _lastDragPosition;
- private bool _endedThisFrame;
- private void Update()
- {
- _touchCount = Input.touchCount;
- if (_touchCount != 1 && _touchCount != 2) return;
- ProcessTouch();
- if (_touchCount == 1)
- Drag();
- else
- Zoom();
- }
- private void ProcessTouch()
- {
- for (int i = 0; i < _touchCount; i++)
- {
- var touch = Input.GetTouch(i);
- if (touch.phase != TouchPhase.Began && touch.phase != TouchPhase.Ended) continue;
- _endedThisFrame = touch.phase == TouchPhase.Ended; // убрать дергание drag при поднятии второго пальца
- if (_touchCount == 2)
- _lastZoomDistance = Vector3.Distance(Input.GetTouch(0).position, Input.GetTouch(1).position);
- else
- _lastDragPosition = Input.GetTouch(0).position;
- }
- }
- private void Drag()
- {
- if (_endedThisFrame) return;
- var touchPos = Input.GetTouch(0).position;
- var dragDelta = touchPos - _lastDragPosition;
- var camFwd = Vector3.ProjectOnPlane(transform.forward, Vector3.up).normalized;
- var camRight = transform.right;
- var translation = camFwd * dragDelta.y + camRight * dragDelta.x;
- transform.Translate(translation * _dragSpeed * Time.deltaTime, Space.World);
- _lastDragPosition = touchPos;
- }
- private void Zoom()
- {
- var zoomDistance = Vector3.Distance(Input.GetTouch(0).position, Input.GetTouch(1).position);
- var zoomDelta = zoomDistance - _lastZoomDistance;
- _lastZoomDistance = zoomDistance;
- if (Mathf.Approximately(transform.position.y, _minY) && zoomDelta > 0 ||
- Mathf.Approximately(transform.position.y, _maxY) && zoomDelta < 0) return;
- transform.Translate(transform.forward * zoomDelta * _zoomSpeed * Time.deltaTime, Space.World);
- var pos = transform.position;
- pos.y = Mathf.Clamp(pos.y, _minY, _maxY);
- transform.position = pos;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement