)
unity中控制UI面板在可视化窗口中进行拖动我建立个简单的粒子如下图所示我们通过EventTriggerType.BeginDrag、EventTriggerType.Drag、EventTriggerType.EndDrag三个方法来实现ui拖动的效果using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; using UnityEngine.EventSystems; public class UIMoveMent : MonoBehaviour { private Camera canvasCam; [SerializeField] private RectTransform CanvasTransform; private RectTransform windowTR; [SerializeField] [Tooltip(要拖动的窗口)] private RectTransform window; private Vector2 initialTouchPos Vector2.zero; public void Awake() { windowTR (RectTransform)window.transform; } public void Start() { EventTrigger eventTrigger this.GetComponentEventTrigger(); if (eventTrigger null) { eventTrigger this.transform.gameObject.AddComponentEventTrigger(); } //清空事件 eventTrigger.triggers.Clear(); AddEventTrigger(eventTrigger, EventTriggerType.BeginDrag, OnDragStarted); AddEventTrigger(eventTrigger, EventTriggerType.Drag, OnDrag); AddEventTrigger(eventTrigger, EventTriggerType.EndDrag, OnEndDrag); } /// summary /// 按下执行函数 /// /summary /// param namedata/param public void OnDragStarted(BaseEventData data) { PointerEventData pointer (PointerEventData)data; canvasCam pointer.pressEventCamera; RectTransformUtility.ScreenPointToLocalPointInRectangle(window, pointer.pressPosition, canvasCam, out initialTouchPos); } /// summary /// 按住执行函数 /// /summary /// param namedata/param public void OnDrag(BaseEventData data) { PointerEventData pointer (PointerEventData)data; Vector2 touchPos; RectTransformUtility.ScreenPointToLocalPointInRectangle(window, pointer.position, canvasCam, out touchPos); window.anchoredPosition touchPos - initialTouchPos; } /// summary /// 松开按钮执行函数 /// /summary /// param namedata/param public void OnEndDrag(BaseEventData data) { EnsureWindowIsWithinBounds(); } public void EnsureWindowIsWithinBounds() { Vector2 canvasSize CanvasTransform.sizeDelta; Vector2 windowSize windowTR.sizeDelta; if (windowSize.x canvasSize.x) windowSize.x canvasSize.x; if (windowSize.y canvasSize.y) windowSize.y canvasSize.y; Vector2 windowPos windowTR.anchoredPosition; Vector2 canvasHalfSize canvasSize * 0.5f; Vector2 windowHalfSize windowSize * 0.5f; Vector2 windowBottomLeft windowPos - windowHalfSize canvasHalfSize; Vector2 windowTopRight windowPos windowHalfSize canvasHalfSize; if (windowBottomLeft.x 0f) windowPos.x - windowBottomLeft.x; else if (windowTopRight.x canvasSize.x) windowPos.x - windowTopRight.x - canvasSize.x; if (windowBottomLeft.y 0f) windowPos.y - windowBottomLeft.y; else if (windowTopRight.y canvasSize.y) windowPos.y - windowTopRight.y - canvasSize.y; windowTR.anchoredPosition windowPos; windowTR.sizeDelta windowSize; } /// summary /// 为EventTrigger添加指定类型的事件 /// /summary /// param nametrigger/param /// param nameeventTriggerType/param /// param namecallback/param private void AddEventTrigger(EventTrigger trigger, EventTriggerType eventTriggerType, UnityActionBaseEventData callback) { //创建事件条目 EventTrigger.Entry entry new EventTrigger.Entry(); entry.eventID eventTriggerType; //创建事件回调 entry.callback new EventTrigger.TriggerEvent(); entry.callback.AddListener(callback); // 添加事件 trigger.triggers.Add(entry); } }将该脚本拖到需要点击触发的UI元素上其中需要对CanvasTransform、window进行赋值如图所示其中window为需要移动的窗口赋值完成后运行程序即可实现类似windows窗口的拖动效果。