在unity中实现拖拽UI边缘调整大小

话不多说直接上代码

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class ResizablePanel : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
    private RectTransform rectTransform;
    private Vector3 initialScale;
    private float initialWidth;
    private bool draggingLeftEdge = false;
    private bool draggingRightEdge = false;
    //private bool draggingMiddleEdge = false;
    private const float dragThreshold = 20f; // 边缘检测的阈值  
    private Canvas canvas;
    void Start()
    {
        rectTransform = GetComponent<RectTransform>();
         canvas = GameObject.Find("Canvas").GetComponent<Canvas>();
    }

    public void OnBeginDrag(PointerEventData eventData)
    {
        Vector2 localPoint;
        RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, eventData.position, eventData.pressEventCamera, out localPoint);
        //draggingMiddleEdge = false;
        if (localPoint.x < dragThreshold)
        {
            draggingLeftEdge = true;
        }
        else if (rectTransform.sizeDelta.x - localPoint.x < dragThreshold)
        {
            draggingRightEdge = true;
        }
        // else
        // {
        //      draggingMiddleEdge = true;
        // }

        initialWidth = rectTransform.sizeDelta.x;
    }
    bool isOnceDrag;
    public void OnDrag(PointerEventData eventData)
    {
        if (draggingLeftEdge || draggingRightEdge)
        {
            Vector2 resizeDelta = eventData.delta;
            float newWidth = initialWidth;

            if (draggingLeftEdge)
            {
                newWidth -= resizeDelta.x;
                newWidth = Mathf.Max(newWidth, 50f); // 最小宽度限制  
                rectTransform.pivot = new Vector2(0, rectTransform.pivot.y); // 确保左边缘作为锚点  
                rectTransform.anchoredPosition += new Vector2(resizeDelta.x, 0);
            }
            else if (draggingRightEdge)
            {
                newWidth += resizeDelta.x;
                newWidth = Mathf.Max(newWidth, 50f); // 最小宽度限制  
            }
            // else if(draggingMiddleEdge)
            // {
            //     rectTransform.anchoredPosition+=eventData.delta/canvas.scaleFactor;
            // }
            

            rectTransform.sizeDelta = new Vector2(newWidth, rectTransform.sizeDelta.y);
            initialWidth = rectTransform.sizeDelta.x;
        }
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        draggingLeftEdge = false;
        draggingRightEdge = false;
    }
}

自行体验效果!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

育婴房扛把子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值