1创建UnityHelper.cs
- using UnityEngine.Events;
- using UnityEngine.EventSystems;
- public class UnityHelper
- {
- /// <summary>
- /// 简化向EventTrigger组件添加事件的操作。
- /// </summary>
- /// <param name="_eventTrigger">要添加事件监听的UI元素上的组件。
- /// <param name="_eventType">监听事件类型</param>
- /// <param name="_unityAction">监听事件触发的函数</param>
- public static void EventTriggerAddEvent(EventTrigger _eventTrigger, EventTriggerType _eventType, UnityAction<BaseEventData> _unityAction)
- {
- if (_eventTrigger == null)
- {
- return;
- }
- //创建一个新的UnityAction<BaseEventData>委托实例,指向传入的_unityAction
- UnityAction<BaseEventData> action = new UnityAction<BaseEventData>(_unityAction);
- //检查_eventTrigger的triggers列表是否已包含事件。如果有,遍历这些事件,寻找匹配_eventType的事件。
- //如果找到匹配项,则直接将_unityAction添加到该事件的回调列表中并返回,避免重复添加
- if (_eventTrigger.triggers.Count != 0)
- {
- for (int i = 0; i < _eventTrigger.triggers.Count; i++)
- {
- if (_eventTrigger.triggers[i].eventID == _eventType)
- {
- _eventTrigger.triggers[i].callback.AddListener(_unityAction);
- return;
- }
- }
- }
- //如果没有找到匹配的事件类型,则创建一个新的EventTrigger.Entry对象,设置其eventID为_eventType,
- //并将之前创建的委托添加到其callback中,最后将这个新事件条目添加到_eventTrigger的triggers列表里。
- //定义所要绑定的事件类型
- EventTrigger.Entry entry = new EventTrigger.Entry();
- //设置事件类型
- entry.eventID = _eventType;
- //设置回掉函数
- entry.callback.AddListener(action);
- //添加触发事件到EventTrigger组件上
- _eventTrigger.triggers.Add(entry);
- }
- }
复制代码 2.新建下列代码后组件绑定与设置

- using System;
- using UnityEngine;
- using UnityEngine.EventSystems;
- //拖动调整ui大小
- public class ComponentBoxPoint : MonoBehaviour, IDragHandler
- {
- public enum BoxPoint // 不同的拖拽点
- {
- UpperLeft,
- UpperCenter,
- UpperRight,
- MiddleLeft,
- MiddleRight,
- LowerLeft,
- LowerCenter,
- LowerRight,
- }
- public BoxPoint boxPoint;//当前拖拽点类型
- public Texture2D cursorTexture;//鼠标悬停时显示的自定义光标纹理
- private RectTransform componentRectTransform;//父级UI组件的RectTransform,用于调整大小和位置
- private Vector2 lastPosition;//父级的x,y坐标
- private EventTrigger eventTrigger;
- private bool isDragging = false;
- private CJCE_Component cjce_component;//父级组件,用于通信是否正在拖动状态。
- //public bool limitHorizontalAxis;//限制拖动时的轴向移动。
- //public bool limitVerticalAxis;
- public Action<ComponentBoxPoint> draggingEvent;//拖动委托事件
- public Action<ComponentBoxPoint> onPointerDownEvent;//按下
- public Action<ComponentBoxPoint> onPointerUpEvent;//松开
- public Vector2 dragOffset;//拖动偏移量
- //坐标系转换成一致的坐标系
- private Camera panelCamera; // 渲染拖拽物体所在的Canvas的相机
- //canvas渲染方式:Screen Space - Overlay—>像素;Screen Space - Camera或World Space—>世界坐标系统,通常以米为单位
- //private Canvas uiCanvas; // 脚本所挂载对象所在的Canvas
- private float scalex;//获取Canvas的缩放
- private float scaley;
- private float posX;//父对象的世界坐标
- private float posY;
- private float width;//父对象的宽度和高度
- private float height;
- private void Start()
- {
- Init();
- InitUIEvent();
- }
- private void Init()
- {
- componentRectTransform = this.transform.parent.GetComponent<RectTransform>();
- lastPosition = componentRectTransform.position;//世界坐标
- eventTrigger = this.GetComponent<EventTrigger>();
- cjce_component = this.GetComponentInParent<CJCE_Component>();
- // 寻找带有"PanelCamera"标签的相机
- GameObject cameraObj = GameObject.FindGameObjectWithTag("tagname");
- if (cameraObj != null)
- {
- panelCamera = cameraObj.GetComponent<Camera>();
- }
- // 寻找带有"PPT"标签的Canvas
- GameObject canvasObj = GameObject.FindGameObjectWithTag("tagname");
- Transform transformComponent = canvasObj.GetComponent<Transform>();
- Vector3 scale = transformComponent.localScale;//缩放比例
- scalex = scale.x;
- scaley = scale.y;
- }
- private void InitUIEvent()//添加事件监听
- {
- UnityHelper.EventTriggerAddEvent(eventTrigger, EventTriggerType.PointerEnter, OnPointerEnter);
- UnityHelper.EventTriggerAddEvent(eventTrigger, EventTriggerType.PointerDown, OnPointerDown);
- UnityHelper.EventTriggerAddEvent(eventTrigger, EventTriggerType.PointerUp, OnPointerUp);
- UnityHelper.EventTriggerAddEvent(eventTrigger, EventTriggerType.PointerExit, OnPointerExit);
- }
- public void OnPointerEnter(BaseEventData eventData)//进入
- {
- Cursor.SetCursor(cursorTexture, new Vector2(cursorTexture.width / 2F, cursorTexture.height / 2f), CursorMode.Auto);
- }
- public void OnPointerDown(BaseEventData eventData)//按下
- {
- Cursor.SetCursor(cursorTexture, new Vector2(cursorTexture.width / 2F, cursorTexture.height / 2f), CursorMode.Auto);
- isDragging = true;
- if (cjce_component) { cjce_component.boxPointIsDraggin = isDragging; }
- if (onPointerDownEvent != null)
- {
- onPointerDownEvent(this);
- }
- lastPosition = componentRectTransform.position;
- posX = lastPosition.x;
- posY = lastPosition.y;
- width = componentRectTransform.rect.width;
- height = componentRectTransform.rect.height;
- }
- public void OnDrag(PointerEventData eventData)//拖拽
- {
- Vector3 mousePosition = Input.mousePosition;//屏幕坐标系:左下角原点,像素为单位
- mousePosition.z = panelCamera.nearClipPlane;
- Vector3 worldMousePosition = panelCamera.ScreenToWorldPoint(mousePosition);//坐标系转换
- float mouseX = worldMousePosition.x;
- float mouseY = worldMousePosition.y;
- //Vector2 _offset = eventData.delta;
- //if (limitHorizontalAxis)
- //{
- // _offset.x = 0;
- //}
- //if (limitVerticalAxis)
- //{
- // _offset.y = 0;
- //}
- //dragOffset = _offset;
- switch (boxPoint)
- {
- case BoxPoint.UpperLeft:
- componentRectTransform.position = new Vector3(mouseX, mouseY, 0);
- componentRectTransform.sizeDelta = new Vector2((-mouseX + posX) / scalex + width, (mouseY - posY) / scaley + height);
- break;
- case BoxPoint.UpperCenter:
- componentRectTransform.position = new Vector3(posX, mouseY, 0);
- componentRectTransform.sizeDelta = new Vector2(width, (mouseY - posY) / scaley + height);
- break;
- case BoxPoint.UpperRight:
- componentRectTransform.position = new Vector3(posX, posY + (mouseY - posY), 0);
- componentRectTransform.sizeDelta = new Vector2((mouseX - posX) / scalex, (mouseY - posY) / scaley + height);
- break;
- case BoxPoint.MiddleLeft:
- componentRectTransform.position = new Vector3(mouseX, posY, 0);
- componentRectTransform.sizeDelta = new Vector2((-mouseX + posX) / scalex + width, height);
- break;
- case BoxPoint.MiddleRight:
- componentRectTransform.sizeDelta = new Vector2((mouseX - posX) / scalex, height);
- break;
- case BoxPoint.LowerLeft:
- componentRectTransform.position = new Vector3(mouseX, posY, 0);
- componentRectTransform.sizeDelta = new Vector2((-mouseX + posX) / scalex + width, (-mouseY + posY) / scaley);
- break;
- case BoxPoint.LowerCenter:
- componentRectTransform.sizeDelta = new Vector2(width, (-mouseY + posY) / scaley);
- break;
- case BoxPoint.LowerRight:
- componentRectTransform.sizeDelta = new Vector2((mouseX - posX) / scalex, (-mouseY + posY) / scaley);
- break;
- default:
- break;
- }
- if (draggingEvent != null)
- {
- draggingEvent(this);
- }
- }
- public void OnPointerUp(BaseEventData eventData)//释放
- {
- Cursor.SetCursor(null, Vector2.zero, CursorMode.Auto);
- isDragging = false;
- if (cjce_component) { cjce_component.boxPointIsDraggin = isDragging; }
- if (onPointerUpEvent != null)
- {
- onPointerUpEvent(this);
- }
- //更新位置信息
- lastPosition = componentRectTransform.position;
- posX = lastPosition.x;
- posY = lastPosition.y;
- width = componentRectTransform.rect.width;
- height = componentRectTransform.rect.height;
- }
- public void OnPointerExit(BaseEventData eventData)//离开
- {
- if (isDragging)
- {
- return;
- }
- Cursor.SetCursor(null, Vector2.zero, CursorMode.Auto);//恢复光标状态
- }
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |