当前位置: 首页 > 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);//恢复光标状态}}

相关文章:

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

1创建UnityHelper.cs using UnityEngine.Events; using UnityEngine.EventSystems;public class UnityHelper {/// <summary>/// 简化向EventTrigger组件添加事件的操作。/// </summary>/// <param name"_eventTrigger">要添加事件监听的UI元素上…...

Scrapy 爬取旅游景点相关数据(五)

本期内容&#xff1a;&#xff08;1&#xff09;爬取日本其他城市数据存入数据库&#xff08;2&#xff09;爬取景点评论数据 1 爬取其他城市景点数据 只爬取一个城市的数据对于做数据可视化系统可能是不够的&#xff0c;因为数据样本量少嘛&#xff0c;本期来爬取其他城市的景…...

程序员纯粹八股文的危害有哪些,应该如何来解决?

“八股文”这个词在程序员面试的上下文中通常指的是那些被广泛讨论、反复练习的问题和答案&#xff0c;它们往往围绕着一些经典的技术知识点&#xff0c;例如算法、数据结构、设计模式等。这些知识在面试中被频繁提及&#xff0c;以至于应聘者经常会提前准备并背诵这些答案&…...

LabVIEW操作系列1

系列文章目录 我的记录&#xff1a; LabVIEW操作系列 文章目录 系列文章目录前言五、特殊用法5.1 取值范围表示5.2 对输入值取值范围进行限定5.3 控制多个While循环停止运行。5.4 获取按钮上的文本5.5 获取按钮上的文本【进阶】 六、使用步骤1.引入库2.读入数据 七、其余功能7.…...

【前端 09】JavaScript中的对象与JSON

JavaScript中的对象与JSON 在JavaScript中&#xff0c;对象和JSON&#xff08;JavaScript Object Notation&#xff09;是两个紧密相连但又有区别的概念。它们都在数据处理和交换中扮演着重要角色。本文将详细讲解JavaScript中的自定义对象以及JSON对象的基本概念、格式、用法…...

C# 字符串罗马数字123转汉字一二三

要将字符串 "123" 转换为 "一二三"&#xff0c;可以通过以下几种方法来实现。 1. 使用映射字典 可以创建一个映射字典&#xff0c;将数字字符映射到对应的中文数字&#xff0c;然后遍历原始字符串进行替换&#xff1a; using System; using System.Coll…...

红杉资本视角:大公司在AI领域的投资策略与市场影响

在人工智能&#xff08;AI&#xff09;的快速发展浪潮中&#xff0c;大型科技公司如谷歌、Meta等正在积极投资&#xff0c;以确保在未来技术竞争中占据有利地位。红杉资本等投资机构对此现象进行了深入分析&#xff0c;探讨了大公司在AI领域的投资策略及其对市场的影响。本文将…...

CI/CD学习之路

CI/CD之路 https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg4NDg0MjQ0MQ&actiongetalbum&album_id3433192036428447744&scene173&subscene&sessionidsvr_0b1e7fe1d6b&enterid1721879847&from_msgid2247485821&from_itemidx1&count3&am…...

IP 泄露: 原因与避免方法

始终关注您的IP信息&#xff01; 您的IP地址不仅显示您的位置&#xff0c;它包含几乎所有的互联网活动信息&#xff01; 如果出现IP泄漏&#xff0c;几乎所有的信息都会被捕获甚至非法利用&#xff01; 那么&#xff0c;网站究竟如何追踪您的IP地址&#xff1f;您又如何有效…...

深⼊理解指针(1)

1. 内存和地址 2. 指针变量和地址 3. 指针变量类型的意义 4. const修饰指针 5. 指针运算 6. 野指针 7. assert断⾔ 8. 指针的使⽤和传址调⽤ 1. 内存和地址 1.1 内存 计算机内存空间如何高效率的管理&#xff1f; 也是把内存划分为⼀个个的内存单元&#xff0c;每个…...

Photoshop 2023:创意无限的图像编辑神器

Photoshop 2023 是一款专为 Mac 和 Windows 系统设计的强大图像编辑软件&#xff0c;为专业设计师和业余爱好者提供了无与伦比的创作工具和功能。 一、强大的编辑工具 Photoshop 2023 拥有丰富的编辑工具&#xff0c;如选择工具、画笔工具、橡皮擦工具等。其选择工具能够精确…...

高校是需要AIGC 实验室还是大数据人工智能实验室呢

AIGC&#xff08;人工智能与图形计算&#xff09;实验室和大数据人工智能实验室虽然都隶属于人工智能的范畴&#xff0c;但它们的关注点、研究方向和具体应用领域有所不同。 我们分别从研发方向、技术侧重、应用领域、研究工具和方法等方面去分析两者的区别&#xff0c;希…...

Nginx系列-12 Nginx使用Lua脚本进行JWT校验

背景 本文介绍Nginx中Lua模块使用方式&#xff0c;并结合案例进行介绍。案例介绍通过lua脚本提取HTTP请求头中的token字段&#xff0c;经过JWT校验并提取id和name信息&#xff0c;设置到http请求头中发向后段服务器。 默认情况下&#xff0c;Nginx自身不携带lua模块&#xff0…...

数据库设计三范式

目录 第一范式 第二范式 第三范式 数据库的设计范式&#xff0c;即数据库设计的原则&#xff1b; 在设计数据库时尽量遵守这三个条件&#xff0c;因为在实际的设计中&#xff0c;根据要求是空间换时间还是时间换空间来遵守范式&#xff1b; 第一范式 每一张表都必须有主键…...

VirtualBox创建共享磁盘

VirtualBox创建共享磁盘 目录 VirtualBox创建共享磁盘1、划分共享磁盘1.1、【管理】->【工具】->【虚拟介质管理】1.2、【创建】->【VDI&#xff08;VirtualBox 磁盘映像&#xff09;】->【下一步】1.3、【预先分配全部空间】->【下一步】1.4、【分配大小】->…...

2024年中职云计算实验室建设及云计算实训平台整体解决方案

随着信息技术的飞速发展&#xff0c;云计算作为新一代信息技术的核心&#xff0c;正逐步渗透到各行各业&#xff0c;成为推动数字化转型的重要力量。为了适应这一趋势&#xff0c;中职教育作为技能型人才培养的重要阵地&#xff0c;亟需加强云计算实验室建设与云计算实训平台的…...

[C++] C++11新增

一、列表初始化 C98&#xff1a; 在C98中&#xff0c;标准允许使用花括号{}对数组元素进行统一的列表初始值设定。 struct Simple1 {int _a;int _b; };//C98 int main() {int a1[] { 1,2,3,4,5,6 };int a2[7] { 0 };//本质是类型转换&#xff08;构造拷贝构造 -> 优化 …...

802.11 wireshark 抓包

80211 wireshark 抓包 前言配置 monitor软件配置wireshark 操作 前言 本人习惯使用 Omnipeek 抓包分析&#xff0c;所以 wireshark 的实验只讲到抓包完成。 Windows 环境采用 wireshark 抓包是比较麻烦的&#xff0c;因为支持在 Windows 环境中支持抓包的网卡并不多&#xff0…...

vscode 调试web后端

1、调试环境配置 一、安装python环境管理器 其中要先在vscode选择对应的python环境&#xff0c;最方便的是按照环境管理器后从中选择。其中在【externsions】里面安装python即可。 如下&#xff1a; 二、编写launch.json文件 其中如下&#xff1a; {// Use IntelliSense …...

JAVA默写单词小程序

编写一个记单词和默写单词两个功能的小程序 package com.lu.word;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString;Data AllArgsConstructor NoArgsConstructor ToString public class A {private String k;p…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像&#xff08;比如分辨率3000*3000的图像&#xff09;的办法&#xff0c;尤其是想把内存中的裸数据&#xff08;只有图像的数据&#xff0c;不包…...