using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; using UInput = UnityEngine.Input; namespace UIWidgetsSample.RaycastableScene { public class DragRotate : MonoBehaviour { Vector2? _lastPosition; public static Vector2 mousePosition { get { return new Vector2(UInput.mousePosition.x, UInput.mousePosition.y); } } private static bool IsPointerOverUIObject(float x, float y) { PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current); eventDataCurrentPosition.position = new Vector2(x, y); List results = new List(); EventSystem.current.RaycastAll(eventDataCurrentPosition, results); return results.Count > 0; } void OnMouseDown() { if (EventSystem.current.IsPointerOverGameObject()) { return; } foreach (Touch touch in UInput.touches) { if (touch.phase == TouchPhase.Began) { int id = touch.fingerId; if (IsPointerOverUIObject(touch.position.x, touch.position.y)) { return; } } } _lastPosition = mousePosition; } private void OnMouseUp() { _lastPosition = null; } private void OnMouseDrag() { if (_lastPosition == null) { return; } Vector2 direction = mousePosition - _lastPosition.Value; _lastPosition = mousePosition; transform.Rotate(-direction.y, -direction.x, 0, Space.World); } } }