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.xdnf.cn/news/1486123.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

系统架构设计师①:计算机组成与体系结构

系统架构设计师①&#xff1a;计算机组成与体系结构 计算机结构 计算机的组成结构可以概括为以下几个主要部分&#xff1a;中央处理器&#xff08;CPU&#xff09;、存储器&#xff08;包括主存和外存&#xff09;、输入设备、输出设备&#xff0c;以及控制器、运算器、总线和…

下拉菜单过渡

下拉过渡&#xff0c;利用Y轴的transform&#xff1a;scaleY(0) —》transform&#xff1a;scaleY(1) 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8" /><meta name"viewport" cont…

C2W3.Assignment.Language Models: Auto-Complete.Part1

理论课&#xff1a;C2W3.Auto-complete and Language Models 文章目录 1 Load and Preprocess Data1.1: Load the data1.2 Pre-process the dataExercise 01.Split data into sentencesExercise 02.Tokenize sentencesExercise 03Split into train and test sets Exercise 04H…

2024.7.22 作业

1.将双向链表和循环链表自己实现一遍&#xff0c;至少要实现创建、增、删、改、查、销毁工作 循环链表 looplinklist.h #ifndef LOOPLINKLIST_H #define LOOPLINKLIST_H#include <myhead.h>typedef int datatype;typedef struct Node {union {int len;datatype data;}…

K8S 部署peometheus + grafana 监控

安装说明 如果有下载不下来的docker镜像可以私信我免费下载。 系统版本为 Centos7.9 内核版本为 6.3.5-1.el7 K8S版本为 v1.26.14 动态存储&#xff1a;部署文档 GitHub地址 下载yaml 文件 ## 因为我的K8S 版本比较新&#xff0c;我下载的是当前的最新版本&#xff0c;你的要…

【启明智显分享】甲醛检测仪HMI方案:ESP32-S3方案4.3寸触摸串口屏,RS485、WIFI/蓝牙可选

今年&#xff0c;“串串房”一词频繁引发广大网友关注。“串串房”&#xff0c;也被称为“陷阱房”“贩子房”——炒房客以低价收购旧房子或者毛坯房&#xff0c;用极度节省成本的方式对房子进行装修&#xff0c;之后作为精修房高价租售&#xff0c;因甲醛等有害物质含量极高&a…

自动驾驶---视觉Transformer的应用

1 背景 在过去的几年&#xff0c;随着自动驾驶技术的不断发展&#xff0c;神经网络逐渐进入人们的视野。Transformer的应用也越来越广泛&#xff0c;逐步走向自动驾驶技术的前沿。笔者也在博客《人工智能---什么是Transformer?》中大概介绍了Transformer的一些内容&#xff1a…

昇思MindSpore 应用学习-K近邻算法实现红酒聚类-CSDN

K近邻算法实现红酒聚类-AI代码解析 本实验主要介绍使用MindSpore在部分wine数据集上进行KNN实验。 1、实验目的 了解KNN的基本概念&#xff1b;了解如何使用MindSpore进行KNN实验。 2、K近邻算法原理介绍 K近邻算法&#xff08;K-Nearest-Neighbor, KNN&#xff09;是一种…

传神社区|数据集合集第7期|法律NLP数据集合集

自从ChatGPT等大型语言模型&#xff08;Large Language Model, LLM&#xff09;出现以来&#xff0c;其类通用人工智能&#xff08;AGI&#xff09;能力引发了自然语言处理&#xff08;NLP&#xff09;领域的新一轮研究和应用浪潮。尤其是ChatGLM、LLaMA等普通开发者都能运行的…

类和对象:完结

1.再深构造函数 • 之前我们实现构造函数时&#xff0c;初始化成员变量主要使⽤函数体内赋值&#xff0c;构造函数初始化还有⼀种⽅ 式&#xff0c;就是初始化列表&#xff0c;初始化列表的使⽤⽅式是以⼀个冒号开始&#xff0c;接着是⼀个以逗号分隔的数据成 员列表&#xf…

嵌入式C/C++、FreeRTOS、STM32F407VGT6和TCP:智能家居安防系统的全流程介绍(代码示例)

1. 项目概述 随着物联网技术的快速发展,智能家居安防系统越来越受到人们的重视。本文介绍了一种基于STM32单片机的嵌入式安防中控系统的设计与实现方案。该系统集成了多种传感器,实现了实时监控、报警和远程控制等功能,为用户提供了一个安全、可靠的家居安防解决方案。 1.1 系…

c++ 高精度加法(只支持正整数)

再给大家带来一篇高精度&#xff0c;不过这次是高精度加法&#xff01;话不多说&#xff0c;开整&#xff01; 声明 与之前那篇文章一样&#xff0c;如果看起来费劲可以结合总代码来看 定义 由于加法进位最多进1位&#xff0c;所以我们的结果ans[]的长度定义为两个加数中最…

【Linux】HTTP 协议

目录 1. URL2. HTTP 协议2.1. HTTP 请求2.2. HTTP 响应 1. URL URL 表示着是统一资源定位符(Uniform Resource Locator), 就是 web 地址&#xff0c;俗称“网址”; 每个有效的 URL 可以通过互联网访问唯一的资源, 是互联网上标准资源的地址; URL 的主要由四个部分组成: sche…

如何查看jvm资源占用情况

如何设置jar的内存 java -XX:MetaspaceSize256M -XX:MaxMetaspaceSize256M -XX:AlwaysPreTouch -XX:ReservedCodeCacheSize128m -XX:InitialCodeCacheSize128m -Xss512k -Xmx2g -Xms2g -XX:UseG1GC -XX:G1HeapRegionSize4M -jar your-application.jar以上配置为堆内存4G jar项…

广州邀请媒体宣传(附媒体名单)

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 广州地区 媒体邀约&#xff1a; 记者现场采访&#xff0c;电视台到场报道&#xff0c;展览展会宣传&#xff0c;广交会企业宣传&#xff0c;工厂探班&#xff0c;媒体专访等。 适合广州…

自监督学习在言语障碍及老年语音识别中的应用

近几十年来针对正常言语的自动语音识别&#xff08;ASR&#xff09;技术取得了快速进展&#xff0c;但准确识别言语障碍&#xff08;dysarthric&#xff09;和老年言语仍然是一项极具挑战性的任务。言语障碍是一种由多种运动控制疾病引起的常见言语障碍类型&#xff0c;包括脑瘫…

android studio中svn的使用

第一步&#xff0c;建立一个项目。 第二步&#xff0c;share project。 第三步&#xff0c;选择存放的位置&#xff0c;然后添加提交信息&#xff0c;最后点击share。这样就可以在svn上面看到一个空的项目名称。 第四步&#xff0c;看到文件变成了绿色&#xff0c;点击commit图…

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(三)基变换与坐标变换;微分方程;李群和李代数;雅可比矩阵

一、基变换与坐标变换 字小,事不小。 因为第一反应:坐标咋变,坐标轴就咋变呀。事实却与我们想象的相反。这俩互为逆矩阵。 第一次读没有读明白,后面到事上才明白。 起因是多传感器标定:多传感器,就代表了多个坐标系,多个基底。激光雷达和imu标定。这个标定程序,网上,…

Python机器学习入门:从理论到实践

文章目录 前言一、机器学习是什么&#xff1f;二、机器学习基本流程三、使用Python进行机器学习1.数据读取2.数据规范化3. 数据降维&#xff08;主成分分析&#xff09;4. 机器学习模型的选择5. 线性回归模型的实现6. 可视化结果 总结 前言 机器学习是人工智能的一个重要分支&…

pytorch 笔记:torch.optim.Adam

torch.optim.Adam 是一个实现 Adam 优化算法的类。Adam 是一个常用的梯度下降优化方法&#xff0c;特别适合处理大规模数据集和参数的深度学习模型 torch.optim.Adam(params, lr0.001, betas(0.9, 0.999), eps1e-08, weight_decay0, amsgradFalse, *, foreachNone, maximizeFa…