using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; using System.Collections; using System; using AX.InputSystem; //处理UI拖动的脚本,该脚本需要挂在可拖动的panel(该panel需要在canvas下)下的直属子物体上, //鼠标托这个子物体时可拖动的panel会在canvas下拖动 [RequireComponent(typeof(CreateStaticObjID))] [RequireComponent(typeof(BaseGameObjInfo))] public class DragPanel : MonoBehaviour, IDragHandler, IEndDragHandler,IBeginDragHandler { private Vector2 originalLocalPointerPosition; private Vector3 originalPanelLocalPosition; private RectTransform panelRectTransform;//要拖动的panel private RectTransform parentRectTransform;//可拖动的panel的拖动范围(这里是画布Canvas) void Start() { panelRectTransform = transform.parent as RectTransform; parentRectTransform = panelRectTransform.parent as RectTransform; } public void OnBeginDrag(PointerEventData eventData) { if (eventData.button != PointerEventData.InputButton.Left) return;//不是左键按下就不能拖拽 var arg = new OnDragCmdArgs(); arg.position = eventData.position; DragBegin(arg); InputManager.isDargUI = true; } public void DragBegin(OnDragCmdArgs args) { RegisterUIInputEvent.RegisterUIInputHistory(gameObject, this.GetType().Name, "DragBegin", args); originalPanelLocalPosition = panelRectTransform.localPosition; RectTransformUtility.ScreenPointToLocalPointInRectangle(parentRectTransform, args.position, null, out originalLocalPointerPosition); } public void OnDrag(PointerEventData data) { if (data.button != PointerEventData.InputButton.Left) return;//不是左键按下就不能拖拽 var arg = new OnDragCmdArgs(); arg.position = data.position; Drag(arg); } public void Drag(OnDragCmdArgs args) { RegisterUIInputEvent.RegisterUIInputHistory(gameObject, this.GetType().Name, "Drag", args); if (panelRectTransform == null || parentRectTransform == null) return; Vector2 localPointerPosition; if (RectTransformUtility.ScreenPointToLocalPointInRectangle(parentRectTransform, args.position, null, out localPointerPosition)) { Vector3 offsetToOriginal = localPointerPosition - originalLocalPointerPosition; panelRectTransform.localPosition = originalPanelLocalPosition + offsetToOriginal; } ClampToWindow(); } void ClampToWindow() { Vector3 pos = panelRectTransform.localPosition; Vector3 minPosition = parentRectTransform.rect.min - panelRectTransform.rect.min; Vector3 maxPosition = parentRectTransform.rect.max - panelRectTransform.rect.max; pos.x = Mathf.Clamp(panelRectTransform.localPosition.x, minPosition.x, maxPosition.x); pos.y = Mathf.Clamp(panelRectTransform.localPosition.y, minPosition.y, maxPosition.y); panelRectTransform.localPosition = pos; } public void OnEndDrag(PointerEventData eventData) { if (eventData.button != PointerEventData.InputButton.Left) return;//不是左键按下就不能拖拽 var arg = new OnDragCmdArgs(); arg.currentCursorPos = Input.mousePosition; RegisterUIInputEvent.RegisterUIInputHistory(gameObject, this.GetType().Name, "EndDrag", arg); EndDrag(arg); } public void EndDrag(CmdArgs args) { if (GameSettings.othersSettings.playState == PlayState.Playing) { CursorManager.GetInstance.SetClick(args); } InputManager.isDargUI = false; } }