当前位置: 首页 > news >正文

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

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>委托实例,指向传入的_unityActionUnityAction<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; // 脚本所挂载对象所在的Canvasprivate 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"标签的CanvasGameObject 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);//恢复光标状态}}
http://www.lryc.cn/news/409644.html

相关文章:

  • Scrapy 爬取旅游景点相关数据(五)
  • 程序员纯粹八股文的危害有哪些,应该如何来解决?
  • LabVIEW操作系列1
  • 【前端 09】JavaScript中的对象与JSON
  • C# 字符串罗马数字123转汉字一二三
  • 红杉资本视角:大公司在AI领域的投资策略与市场影响
  • CI/CD学习之路
  • IP 泄露: 原因与避免方法
  • 深⼊理解指针(1)
  • Photoshop 2023:创意无限的图像编辑神器
  • 高校是需要AIGC 实验室还是大数据人工智能实验室呢
  • Nginx系列-12 Nginx使用Lua脚本进行JWT校验
  • 数据库设计三范式
  • VirtualBox创建共享磁盘
  • 2024年中职云计算实验室建设及云计算实训平台整体解决方案
  • [C++] C++11新增
  • 802.11 wireshark 抓包
  • vscode 调试web后端
  • JAVA默写单词小程序
  • 认知、情绪、情感、意志、人格
  • 解析capl文件生成XML Test Module对应的xml工具
  • Java中的反射是怎么回事?
  • 07 STM32寄存器开发基础-中断编程
  • 聚簇和非聚簇索引/Btree和B+tree
  • 清华学姐熬夜肝了15天的软件测试面试题出炉(附答案)建议收藏!
  • Docker 安装指南
  • 系统架构设计师 - 知识产权与标准化
  • 【Python】Facebook开源时间序列数据预测模型Prophet
  • Spring 常用的三种拦截器详解
  • 微前端概念