using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; public class sceneContorl : MonoBehaviour, IDragHandler, IBeginDragHandler, IEndDragHandler { public Camera m_cam; public GameObject mainScene; private bool m_fingerDown = false; // 手指的起始位置 private Vector2 m_oneFingerDragStartPos; // UI元素的 RectTransform private RectTransform mainSceneRectTransform; // 灵敏度系数 private float sensitivity = 0.5f; // 可以根据需要调整此值 // 滑动限制的最小值和最大值 public float minX = -500f; // 最小x值 public float maxX = 500f; // 最大x值 [Header("定义目标位置")] public float[] targetPositions = new float[] { 0f, -2100f, -3760f, -5350f }; // 引用 mainBTN 脚本 public mainBTN mainBtnScript; // Start is called before the first frame update void Start() { mainSceneRectTransform = mainScene.GetComponent(); } /// /// 单指滑动 /// private void HandleFingerDragMove(Vector2 fingerPos) { // 计算当前帧的滑动增量(交换顺序,保证滑动方向一致) Vector3 moveDelta = fingerPos - m_oneFingerDragStartPos; // 当前触摸位置 - 起始位置 Vector3 newPos = mainSceneRectTransform.anchoredPosition; // 根据滑动增量计算新的x轴位置,并限制在指定范围内 newPos.x = newPos.x + (moveDelta.x * sensitivity); // 限制x轴位置在 minX 和 maxX 之间 newPos.x = Mathf.Clamp(newPos.x, minX, maxX); mainSceneRectTransform.anchoredPosition = newPos; // 设置新的锚点位置 // 更新起始位置,用于计算下一帧的增量 m_oneFingerDragStartPos = fingerPos; } /// /// 计算当前位置与目标位置数组中哪个位置最接近,并返回对应的目标位置值. /// /// 当前X坐标 /// 返回距离最近的目标位置值 float FindClosestNumber(float target) { float closestNumber = targetPositions[0]; // 默认第一个数为最近的数 float minDifference = Mathf.Abs(target - closestNumber); // 计算与第一个数的差值 foreach (float number in targetPositions) { float difference = Mathf.Abs(target - number); // 计算当前数与目标数的差值 if (difference < minDifference) // 如果当前差值更小,更新最近的数 { closestNumber = number; minDifference = difference; } } return closestNumber; } public void OnDrag(PointerEventData eventData) { HandleFingerDragMove(eventData.position); } public void OnBeginDrag(PointerEventData eventData) { m_oneFingerDragStartPos = Input.mousePosition; // 获取鼠标按下的起始位置 } public void OnEndDrag(PointerEventData eventData) { mainBtnScript.MovePanel(FindClosestNumber(mainSceneRectTransform.anchoredPosition.x)); } }