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>委托实例,指向传入的_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);//恢复光标状态
    }


}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Unity实现鼠标滑轮放大缩小图片,可以通过以下步骤实现: 1. 创建一个Image对象,并将其添加到Canvas中。 2. 给Image对象添加一个Rect Transform组件,用于控制图片位置和大小。 3. 给Image对象添加一个Event Trigger组件,并添加两个事件:OnScroll和OnDrag。 4. 在OnScroll事件中,使用鼠标滑轮的delta值来缩放图片的大小。可以使用RectTransform组件的localScale属性来实现缩放。 5. 在OnDrag事件中,使用鼠标的delta值来移动图片位置。可以使用RectTransform组件的anchoredPosition属性来实现移动。 下面是一个示例代码: ``` using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; public class ImageController : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IDragHandler, IScrollHandler { public Image image; public float zoomSpeed = 0.1f; public float moveSpeed = 1.0f; private bool isDragging = false; private Vector2 dragStartPosition; public void OnPointerEnter(PointerEventData eventData) { // 鼠标进入图片区域时,允许滑动和缩放图片 image.rectTransform.pivot = new Vector2(0.5f, 0.5f); image.rectTransform.localScale = Vector3.one; image.rectTransform.localPosition = Vector3.zero; } public void OnPointerExit(PointerEventData eventData) { // 鼠标离开图片区域时,还原图片位置和大小 image.rectTransform.pivot = new Vector2(0f, 1f); image.rectTransform.localScale = Vector3.one; image.rectTransform.localPosition = Vector3.zero; } public void OnDrag(PointerEventData eventData) { // 鼠标左键按住拖动时,移动图片位置 if (Input.GetMouseButton(0)) { if (!isDragging) { isDragging = true; dragStartPosition = eventData.position; } else { Vector2 delta = eventData.position - dragStartPosition; image.rectTransform.anchoredPosition += delta * moveSpeed; dragStartPosition = eventData.position; } } else { isDragging = false; } } public void OnScroll(PointerEventData eventData) { // 使用鼠标滚轮缩放图片大小 float scale = 1.0f + eventData.scrollDelta.y * zoomSpeed; image.rectTransform.localScale *= scale; } } ``` 将这个脚本组件添加到Image对象上,然后将Image对象的Image组件和RectTransform组件赋值给对应的变量,即可实现鼠标滑轮放大缩小图片鼠标左键按住滑动拖动图片的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

氿 柒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值