using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> /// 对RectTransform进行控制 /// 双指缩放、单指移动 /// </summary> public class UITouchTransform : MonoBehaviour { //要控制的目标对象 [SerializeField] private RectTransform m_Target; //定义可交互区域 [SerializeField] private RectTransform m_InteractableRect; //UI相机 [SerializeField] private Camera m_UICamera = null; //触摸缩放速度 [SerializeField] private float m_TouchScaleSpeed = 0.01f; //最小缩放值 [SerializeField] private float m_MinScale = 0.1f; //最大缩放值 [SerializeField] private float m_MaxScale = 2f; //是否允许拖动 [SerializeField] private bool m_AllowDrag = true; //是否允许缩放 [SerializeField] private bool m_AllowScale = true; private float m_LastDistance = 0; private Vector2 m_lastPosition = Vector2.zero; void Awake() { if (m_Target == null) m_Target = this.GetComponent<RectTransform>(); } void Update() { if (!Input.touchSupported) //设备是否支持触摸 return; int touchCount = Input.touchCount; if (touchCount <= 0) return; switch (touchCount) { case 1: TouchDrag(); break; case 2: TouchScale(); break; } } private void TouchDrag() { if (!m_AllowDrag) return; //判断手指是否在允许操作的区域内操作 if (m_InteractableRect != null && !RectTransformUtility.RectangleContainsScreenPoint(m_InteractableRect, Input.touches[0].position, m_UICamera)) return; Vector2 deltaPosition = Input.touches[0].deltaPosition; if (Input.touches[0].phase == TouchPhase.Moved) { m_Target.anchoredPosition += deltaPosition; } } private void TouchScale() { if (!m_AllowScale) return; //判断手指是否在允许操作的区域内操作 if (m_InteractableRect != null && !RectTransformUtility.RectangleContainsScreenPoint(m_InteractableRect, Input.touches[0].position, m_UICamera) && !RectTransformUtility.RectangleContainsScreenPoint(m_InteractableRect, Input.touches[1].position, m_UICamera)) return; Vector3 firstTouch = Input.touches[0].position; Vector3 secondTouch = Input.touches[1].position; float twoTouchDistance = Vector2.Distance(firstTouch, secondTouch); if (Input.touches[1].phase == TouchPhase.Began) m_LastDistance = twoTouchDistance; else if (Input.touches[1].phase == TouchPhase.Ended) //双指变单指的情况,不会触发touches[0]的Began阶段 m_lastPosition = Input.touches[0].position; else if (Input.touches[0].phase == TouchPhase.Ended) //双指变单指的情况,不会触发touches[1]的Began阶段 m_lastPosition = Input.touches[1].position; float scale = Mathf.Clamp(m_Target.localScale.x + (twoTouchDistance - m_LastDistance) * m_TouchScaleSpeed, m_MinScale, m_MaxScale); m_Target.localScale = new Vector3(scale, scale, scale); m_LastDistance = twoTouchDistance; } }