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

news2024/9/20 13:16:53

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);//恢复光标状态
    }


}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1952089.html

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

相关文章

Memcached开发(十四):常见问题与故障排除

目录 1. 内存使用问题 1.1 内存不足 1.2 内存泄漏 2. 连接问题 2.1 连接超时 2.2 连接断开 3. 数据一致性问题 3.1 缓存穿透 3.2 缓存雪崩 3.3 缓存击穿 4. 性能问题 4.1 响应时间过长 4.2 吞吐量不足 5. 安全问题 5.1 未授权访问 5.2 数据泄露 6. 版本兼容问…

驾驭代码的无形疆界:动态内存管理揭秘

目录 1.:为什么要有动态内存分配 2.malloc和free 2.1:malloc 2.2:free 3.calloc和realloc 3.1:calloc 3.1.1:代码1(malloc) 3.1.2:代码2(calloc) 3.2:realloc 3.2.1:原地扩容 3.2.2:异地扩容 3.2.3:代码1(原地扩容) 3.2.3:代码2(异地扩容) 4:常见的动态内存的错误…

AR 眼镜之-充电动画定制-实现方案

目录 &#x1f4c2; 前言 AR 眼镜系统版本 充电动画 1. &#x1f531; 技术方案 1.1 方案介绍 1.2 实现方案 关机充电动画 亮屏/锁屏充电动画 2. &#x1f4a0; 关机充电动画 2.1 关机充电动画核心处理类与路径 2.2 实现细节 步骤一&#xff1a;1&#xff09;定制 …

Javascript前端面试基础5【每日更10】

let与var的区别 let命令不存在变量提升&#xff0c;如果在let前使用&#xff0c;会导致报错&#xff08;var存在变量提升&#xff09;如果块区中存在let和const命令&#xff0c;就会形成封闭作用域不允许重复声明&#xff0c;因此&#xff0c;不能在函数内部重新声明参数 m…

Pcl读取stl文件,并转换成pcd文件,同时显示stl模型和pcd点云

由于不同版本的pcl兼容范围不一样&#xff0c;这里有2个版本的代码&#xff0c;里面的文件路径需要实际情况修改即可&#xff0c;希望对您有所参考或帮助 pcl1.8.1和vs2015版本代码 #include <iostream> #include <pcl/io/io.h> #include <pcl/io/pcd_io.h>…

序列化与反序列化的本质

1. 将对象存储到本地 假如有一个student类&#xff0c;我们定义了好几个对象&#xff0c;想要把这些对象存储下来&#xff0c;该怎么办呢 from typing import List class Student:name: strage: intphones: List[str] s1 Student("xiaoming",10,["huawei&quo…

大模型微调部署实战及类GPT工具的高效使用

大家好&#xff0c;我是herosunly。985院校硕士毕业&#xff0c;现担任算法研究员一职&#xff0c;热衷于大模型算法的研究与应用。曾担任百度千帆大模型比赛、BPAA算法大赛评委&#xff0c;编写微软OpenAI考试认证指导手册。曾获得阿里云天池比赛第一名&#xff0c;CCF比赛第二…

《RMT: Retentive Networks Meet Vision Transformers》CVPR2024

论文&#xff1a;RMT: Retentive Networks Meet Vision Transformers - AMiner 摘要 这篇论文探讨了将Retentive Network&#xff08;RetNet&#xff09;的概念引入到计算机视觉领域&#xff0c;并与Vision Transformer结合&#xff0c;提出了一种新的模型RMT&#xff08;Ret…

牛津剑桥等发现:AI 训 AI 惨遭投毒 9 次大崩溃

【新智元导读】9 次迭代后&#xff0c;模型开始出现诡异乱码&#xff0c;直接原地崩溃&#xff01;牛津、剑桥等机构的一篇论文登上了 Nature 封面&#xff0c;称合成数据就像近亲繁殖&#xff0c;效果无异于投毒。有无破解之法&#xff1f;那就是 —— 更多使用人类数据&#…

护眼灯有没有护眼的效果?一文揭秘用护眼灯到底好不好

护眼灯有没有护眼的效果&#xff1f;在现在这个时代&#xff0c;无论是在学习还是办公&#xff0c;都很难离开一款好用的台灯&#xff0c;所以&#xff0c;为了避免会挑选到质量不好的台灯&#xff0c;我们应该要先避开一些网红小品牌&#xff0c;优先选择有专业技术支持的&…

ClickHouse 24.6 版本发布说明

本文字数&#xff1a;14127&#xff1b;估计阅读时间&#xff1a;36 分钟 作者&#xff1a;ClickHouse team 本文在公众号【ClickHouseInc】首发 又到了发布新版本的时间&#xff01; 发布概要 本次ClickHouse 24.6 版本包含了23个新功能&#x1f381;、24项性能优化&#x1f6…

maven介绍 搭建Nexus3(maven私服搭建)

Maven是一个强大的项目管理工具&#xff0c;它基于项目对象模型&#xff08;POM&#xff1a;Project Object Model&#xff09;的概念&#xff0c;通过XML格式的配置文件&#xff08;pom.xml&#xff09;来管理项目的构建 Maven确实可以被视为一种工程管理工具或项目自动化构…

使用flutter做圆形进度条 (桌面端)

前言 最近收到一个需求&#xff0c;需要使用flutter 来做一个圆形进度条&#xff0c;这可难倒我了&#xff0c;毕竟我是做前端的&#xff0c;flutter 之前接触的也少&#xff0c;但没办法&#xff0c;既然需求有了&#xff0c;也得硬着头皮上了&#xff0c;先来看看做的效果。…

简过网:大学生考公,一定要先好好看看这篇文章!

大家好&#xff0c;我是简过网&#xff0c;今天这篇文章我们来聊聊关于大学生考公的那些事儿&#xff0c;希望能给大学生们一点点的帮助&#xff01; 首先&#xff0c;可能有朋友会问了&#xff0c;大学生一般从什么时候开始备考公务员呢&#xff0c;在这里小编建议大家从大三…

《昇思25天学习打卡营第24天|基于MindSpore通过GPT实现情感分类》

基于MindSpore通过GPT实现情感分类 %%capture captured_output # 实验环境已经预装了mindspore2.2.14&#xff0c;如需更换mindspore版本&#xff0c;可更改下面mindspore的版本号 !pip uninstall mindspore -y !pip install -i https://pypi.mirrors.ustc.edu.cn/simple mind…

yolov5-7环境搭建训练自己的模型

1.下载代码 git clone https://github.com/ultralytics/yolov5 # clone可以切到5-7版本&#xff0c;也可以去github选标签下载 2.配置好conda环境&#xff0c;网上教程比较多&#xff0c;不做讲解&#xff0c;python3.8即可。 3.在环境里安装pyrtorch 按自己的需求选取&am…

每日一练,java05

目录 题目知识点&#xff1a;1.12.13.1 题目 选自牛客网 1.下列表述错误的是&#xff1f;&#xff08;&#xff09; A.int是基本类型&#xff0c;直接存数值&#xff0c;Integer是对象&#xff0c;用一个引用指向这个对象。 B.在子类构造方法中使用super()显示调用父类的构造…

第T6周:使用TensorFlow实现好莱坞明星识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 文章目录 一、前期工作1.设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;2. 导入数据3. 查看数据 二、数据预处理1、加载数据2、数据可视化3、再…

【论文速读】| LLMCloudHunter:利用大语言模型(LLMs)从基于云的网络威胁情报(CTI)中自动提取检测规则

本次分享论文&#xff1a;LLMCloudHunter: Harnessing LLMs for Automated Extraction of Detection Rules from Cloud-Based CTI 基本信息 原文作者&#xff1a;Yuval Schwartz, Lavi Benshimol, Dudu Mimran, Yuval Elovici, Asaf Shabtai 作者单位&#xff1a;Ben-Gurion…

mfc100u.dll 文件缺失?两种方法快速修复丢失mfc100u.dll 文件难题

您的电脑是否遭遇了 mfc100u.dll 文件缺失的问题&#xff1f;这种情况通常由多种原因引起。在本文中&#xff0c;我们将介绍两种修复 mfc100u.dll 文件丢失问题的策略——一种是手动方法&#xff0c;另一种是自动修复的使用。我们将探讨如何有效地解决 mfc100u.dll 文件缺失的几…