建设培训网站,淘宝优惠券发布网站怎么做,系统更新后wordpress,慈溪做网站文章目录 #x1f449;一、背景#x1f449;二、效果图#x1f449;三、原理#x1f449;四、核心代码#x1f449;五#xff0c;总结 #x1f449;一、背景
之前做PC项目时常常有面板拖拽移动的需求#xff0c;今天总结封装一下#xff0c;做成一个随时随地可复用的… 文章目录 一、背景二、效果图三、原理四、核心代码五总结 一、背景
之前做PC项目时常常有面板拖拽移动的需求今天总结封装一下做成一个随时随地可复用的拖拽面板功能。
二、效果图 三、原理
实现原理也非常简单。首先继承UI事件系统下的两个接口 IBeginDragHandler, IDragHandler 进而实现两个接口方法即可主要是在开始拖拽事件里面记录鼠标按下的坐标mMouseDownPosition和面板的初始坐标mPanelOriginPosition然后在拖拽过程中鼠标在Canvas下的坐标减去开始拖拽的鼠标坐标得到一个鼠标坐标偏移量加上原始面板坐标得到一个新的拖拽位置的坐标进行坐标赋值即可。
四、核心代码
using UnityEngine;
using UnityEngine.EventSystems;namespace Utility
{/// summary/// UGUI面板的拖拽移动功能/// /summary[RequireComponent(typeof(RectTransform))]public class DragPanel : MonoBehaviour, IBeginDragHandler, IDragHandler{/// summary/// 静态方法提供动态绑定拖拽面板的接口/// /summary/// param namerectTransform/param/// returns/returnspublic static DragPanel Get(RectTransform rectTransform){DragPanel dragPanel rectTransform.gameObject.GetComponentDragPanel();if (dragPanel null){dragPanel rectTransform.gameObject.AddComponentDragPanel();}return dragPanel;}/// summary/// 当前拖拽面板的根节点一般是Canvas/// /summaryprivate RectTransform canvasRect;private Canvas rootCanvas;private Camera uiCam;/// summary/// 是否允许拖拽/// /summaryprivate bool isAllowDrag;private Vector3 mMouseDownPosition;private Vector3 mPanelOriginPosition;private void Awake(){Transform root transform.root;if (root ! null){rootCanvas root.GetComponentCanvas();canvasRect root as RectTransform;if (rootCanvas.renderMode RenderMode.ScreenSpaceCamera){uiCam rootCanvas.worldCamera;}}isAllowDrag rootCanvas ! null;}public void OnBeginDrag(PointerEventData eventData){if (!isAllowDrag) return;RectTransformUtility.ScreenPointToWorldPointInRectangle(canvasRect,Input.mousePosition,uiCam,out mMouseDownPosition);mPanelOriginPosition transform.position;}public void OnDrag(PointerEventData eventData){if (!isAllowDrag) return;Vector3 currentMousePosInUGUI;RectTransformUtility.ScreenPointToWorldPointInRectangle(canvasRect,Input.mousePosition,uiCam,out currentMousePosInUGUI);transform.position mPanelOriginPosition (currentMousePosInUGUI - mMouseDownPosition);}}
}
食用方法 直接将DragPanel脚本拖拽赋值给需要拖拽的UI面板。 如果需要拖拽功能的UI面板多可使用动态绑定方法该脚本提供了一个Get方法参数为需要拖拽的对象的RectTransform组件。 代码动态绑定方法如下 RectTransform rectTransform xxx;//需要赋值对象不能为空哦。DragPanel.Get(rectTransform);五总结
后续可以进行优化的地方
鼠标拖拽移动可以是用平滑移动方法对拖拽范围进行限制