话不多说直接上代码
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;
}
}
自行体验效果!