unity 实现图片的放大与缩小(根据鼠标位置拉伸放缩) ...

打印 上一主题 下一主题

主题 1005|帖子 1005|积分 3015

1创建UnityHelper.cs

  1. using UnityEngine.Events;
  2. using UnityEngine.EventSystems;
  3. public class UnityHelper
  4. {
  5.     /// <summary>
  6.     /// 简化向EventTrigger组件添加事件的操作。
  7.     /// </summary>
  8.     /// <param name="_eventTrigger">要添加事件监听的UI元素上的组件。
  9.     /// <param name="_eventType">监听事件类型</param>
  10.     /// <param name="_unityAction">监听事件触发的函数</param>
  11.     public static void EventTriggerAddEvent(EventTrigger _eventTrigger, EventTriggerType _eventType, UnityAction<BaseEventData> _unityAction)
  12.     {                        
  13.         if (_eventTrigger == null)
  14.         {
  15.             return;
  16.         }
  17.         //创建一个新的UnityAction<BaseEventData>委托实例,指向传入的_unityAction
  18.         UnityAction<BaseEventData> action = new UnityAction<BaseEventData>(_unityAction);
  19.         //检查_eventTrigger的triggers列表是否已包含事件。如果有,遍历这些事件,寻找匹配_eventType的事件。
  20.         //如果找到匹配项,则直接将_unityAction添加到该事件的回调列表中并返回,避免重复添加
  21.         if (_eventTrigger.triggers.Count != 0)
  22.         {
  23.             for (int i = 0; i < _eventTrigger.triggers.Count; i++)
  24.             {
  25.                 if (_eventTrigger.triggers[i].eventID == _eventType)
  26.                 {
  27.                     _eventTrigger.triggers[i].callback.AddListener(_unityAction);
  28.                     return;
  29.                 }
  30.             }
  31.         }
  32.         //如果没有找到匹配的事件类型,则创建一个新的EventTrigger.Entry对象,设置其eventID为_eventType,
  33.         //并将之前创建的委托添加到其callback中,最后将这个新事件条目添加到_eventTrigger的triggers列表里。
  34.         //定义所要绑定的事件类型
  35.         EventTrigger.Entry entry = new EventTrigger.Entry();
  36.         //设置事件类型
  37.         entry.eventID = _eventType;
  38.         //设置回掉函数
  39.         entry.callback.AddListener(action);
  40.         //添加触发事件到EventTrigger组件上
  41.         _eventTrigger.triggers.Add(entry);
  42.     }
  43. }
复制代码
2.新建下列代码后组件绑定与设置


  1. using System;
  2. using UnityEngine;
  3. using UnityEngine.EventSystems;
  4. //拖动调整ui大小
  5. public class ComponentBoxPoint : MonoBehaviour, IDragHandler
  6. {
  7.     public enum BoxPoint // 不同的拖拽点
  8.     {
  9.         UpperLeft,
  10.         UpperCenter,
  11.         UpperRight,
  12.         MiddleLeft,
  13.         MiddleRight,
  14.         LowerLeft,
  15.         LowerCenter,
  16.         LowerRight,
  17.     }
  18.     public BoxPoint boxPoint;//当前拖拽点类型
  19.     public Texture2D cursorTexture;//鼠标悬停时显示的自定义光标纹理
  20.     private RectTransform componentRectTransform;//父级UI组件的RectTransform,用于调整大小和位置
  21.     private Vector2 lastPosition;//父级的x,y坐标
  22.     private EventTrigger eventTrigger;
  23.     private bool isDragging = false;
  24.     private CJCE_Component cjce_component;//父级组件,用于通信是否正在拖动状态。
  25.     //public bool limitHorizontalAxis;//限制拖动时的轴向移动。
  26.     //public bool limitVerticalAxis;
  27.     public Action<ComponentBoxPoint> draggingEvent;//拖动委托事件
  28.     public Action<ComponentBoxPoint> onPointerDownEvent;//按下
  29.     public Action<ComponentBoxPoint> onPointerUpEvent;//松开
  30.     public Vector2 dragOffset;//拖动偏移量
  31.     //坐标系转换成一致的坐标系
  32.     private Camera panelCamera; // 渲染拖拽物体所在的Canvas的相机
  33.     //canvas渲染方式:Screen Space - Overlay—>像素;Screen Space - Camera或World Space—>世界坐标系统,通常以米为单位
  34.     //private Canvas uiCanvas; // 脚本所挂载对象所在的Canvas
  35.     private float scalex;//获取Canvas的缩放
  36.     private float scaley;
  37.     private float posX;//父对象的世界坐标
  38.     private float posY;
  39.     private float width;//父对象的宽度和高度
  40.     private float height;
  41.     private void Start()
  42.     {
  43.         Init();
  44.         InitUIEvent();
  45.     }
  46.     private void Init()
  47.     {
  48.         componentRectTransform = this.transform.parent.GetComponent<RectTransform>();
  49.         lastPosition = componentRectTransform.position;//世界坐标
  50.         eventTrigger = this.GetComponent<EventTrigger>();
  51.         cjce_component = this.GetComponentInParent<CJCE_Component>();
  52.         // 寻找带有"PanelCamera"标签的相机
  53.         GameObject cameraObj = GameObject.FindGameObjectWithTag("tagname");
  54.         if (cameraObj != null)
  55.         {
  56.             panelCamera = cameraObj.GetComponent<Camera>();
  57.         }
  58.         // 寻找带有"PPT"标签的Canvas
  59.         GameObject canvasObj = GameObject.FindGameObjectWithTag("tagname");
  60.         Transform transformComponent = canvasObj.GetComponent<Transform>();
  61.         Vector3 scale = transformComponent.localScale;//缩放比例
  62.         scalex = scale.x;
  63.         scaley = scale.y;
  64.     }
  65.     private void InitUIEvent()//添加事件监听
  66.     {
  67.         UnityHelper.EventTriggerAddEvent(eventTrigger, EventTriggerType.PointerEnter, OnPointerEnter);
  68.         UnityHelper.EventTriggerAddEvent(eventTrigger, EventTriggerType.PointerDown, OnPointerDown);
  69.         UnityHelper.EventTriggerAddEvent(eventTrigger, EventTriggerType.PointerUp, OnPointerUp);
  70.         UnityHelper.EventTriggerAddEvent(eventTrigger, EventTriggerType.PointerExit, OnPointerExit);
  71.     }
  72.     public void OnPointerEnter(BaseEventData eventData)//进入
  73.     {
  74.         Cursor.SetCursor(cursorTexture, new Vector2(cursorTexture.width / 2F, cursorTexture.height / 2f), CursorMode.Auto);
  75.     }
  76.     public void OnPointerDown(BaseEventData eventData)//按下
  77.     {
  78.         Cursor.SetCursor(cursorTexture, new Vector2(cursorTexture.width / 2F, cursorTexture.height / 2f), CursorMode.Auto);
  79.         isDragging = true;
  80.         if (cjce_component) { cjce_component.boxPointIsDraggin = isDragging; }
  81.         if (onPointerDownEvent != null)
  82.         {
  83.             onPointerDownEvent(this);
  84.         }
  85.         lastPosition = componentRectTransform.position;
  86.         posX = lastPosition.x;
  87.         posY = lastPosition.y;
  88.         width = componentRectTransform.rect.width;
  89.         height = componentRectTransform.rect.height;
  90.     }
  91.     public void OnDrag(PointerEventData eventData)//拖拽
  92.     {
  93.         Vector3 mousePosition = Input.mousePosition;//屏幕坐标系:左下角原点,像素为单位
  94.         mousePosition.z = panelCamera.nearClipPlane;
  95.         Vector3 worldMousePosition = panelCamera.ScreenToWorldPoint(mousePosition);//坐标系转换
  96.         float mouseX = worldMousePosition.x;
  97.         float mouseY = worldMousePosition.y;
  98.         //Vector2 _offset = eventData.delta;
  99.         //if (limitHorizontalAxis)
  100.         //{
  101.         //    _offset.x = 0;
  102.         //}
  103.         //if (limitVerticalAxis)
  104.         //{
  105.         //    _offset.y = 0;
  106.         //}
  107.         //dragOffset = _offset;
  108.         switch (boxPoint)
  109.         {
  110.             case BoxPoint.UpperLeft:
  111.                 componentRectTransform.position = new Vector3(mouseX, mouseY, 0);
  112.                 componentRectTransform.sizeDelta = new Vector2((-mouseX + posX) / scalex + width, (mouseY - posY) / scaley + height);
  113.                 break;
  114.             case BoxPoint.UpperCenter:
  115.                 componentRectTransform.position = new Vector3(posX, mouseY, 0);
  116.                 componentRectTransform.sizeDelta = new Vector2(width, (mouseY - posY) / scaley + height);
  117.                 break;
  118.             case BoxPoint.UpperRight:
  119.                 componentRectTransform.position = new Vector3(posX, posY + (mouseY - posY), 0);
  120.                 componentRectTransform.sizeDelta = new Vector2((mouseX - posX) / scalex, (mouseY - posY) / scaley + height);
  121.                 break;
  122.             case BoxPoint.MiddleLeft:
  123.                 componentRectTransform.position = new Vector3(mouseX, posY, 0);
  124.                 componentRectTransform.sizeDelta = new Vector2((-mouseX + posX) / scalex + width, height);
  125.                 break;
  126.             case BoxPoint.MiddleRight:
  127.                 componentRectTransform.sizeDelta = new Vector2((mouseX - posX) / scalex, height);
  128.                 break;
  129.             case BoxPoint.LowerLeft:
  130.                 componentRectTransform.position = new Vector3(mouseX, posY, 0);
  131.                 componentRectTransform.sizeDelta = new Vector2((-mouseX + posX) / scalex + width, (-mouseY + posY) / scaley);
  132.                 break;
  133.             case BoxPoint.LowerCenter:
  134.                 componentRectTransform.sizeDelta = new Vector2(width, (-mouseY + posY) / scaley);
  135.                 break;
  136.             case BoxPoint.LowerRight:
  137.                 componentRectTransform.sizeDelta = new Vector2((mouseX - posX) / scalex, (-mouseY + posY) / scaley);
  138.                 break;
  139.             default:
  140.                 break;
  141.         }
  142.         if (draggingEvent != null)
  143.         {
  144.             draggingEvent(this);
  145.         }
  146.     }
  147.     public void OnPointerUp(BaseEventData eventData)//释放
  148.     {
  149.         Cursor.SetCursor(null, Vector2.zero, CursorMode.Auto);
  150.         isDragging = false;
  151.         if (cjce_component) { cjce_component.boxPointIsDraggin = isDragging; }
  152.         if (onPointerUpEvent != null)
  153.         {
  154.             onPointerUpEvent(this);
  155.         }
  156.         //更新位置信息
  157.         lastPosition = componentRectTransform.position;
  158.         posX = lastPosition.x;
  159.         posY = lastPosition.y;
  160.         width = componentRectTransform.rect.width;
  161.         height = componentRectTransform.rect.height;
  162.     }
  163.     public void OnPointerExit(BaseEventData eventData)//离开
  164.     {
  165.         if (isDragging)
  166.         {
  167.             return;
  168.         }
  169.         Cursor.SetCursor(null, Vector2.zero, CursorMode.Auto);//恢复光标状态
  170.     }
  171. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

花瓣小跑

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表