UGUI拖拽和范围限制

UGUI拖拽和范围限制

实现效果如下

说明:

  1. 脚本挂Image上的,Iamge是窗口红色标题栏
  2. Drag3是一个窗口因为测试忘了改名字
  3. 这个拖拽脚本对于三种Canvas渲染模式均有效
    在这里插入图片描述
    这张图演示Canvas的世界物体模式,注意看Scene面板
    在这里插入图片描述

实现代码如下

using UnityEngine;
using UnityEngine.EventSystems;
public class Drag3 : MonoBehaviour, IBeginDragHandler, IDragHandler
{
    public RectTransform dragTarget;//被拖拽的物体
    public RectTransform dragRangeRect;//拖拽限制范围Rect
    Vector2 offset;//偏移量

    //开始拖拽
    public void OnBeginDrag(PointerEventData eventData)
    {
        Vector2 localPoint;
        if (RectTransformUtility.ScreenPointToLocalPointInRectangle(dragRangeRect, eventData.position, eventData.pressEventCamera, out localPoint))
        {
            offset = (Vector2)dragTarget.localPosition - localPoint;//算出开始拖拽时候鼠标点和 dragTarget的偏移量
        }
    }
    //拖拽中
    public void OnDrag(PointerEventData eventData)
    {
        //把鼠标点映射到dragRangeRect的局部坐标点
        Vector2 localPoint;
        if (RectTransformUtility.ScreenPointToLocalPointInRectangle(dragRangeRect, eventData.position, eventData.pressEventCamera, out localPoint))
        {
            dragTarget.localPosition = localPoint + offset;
        }
        //不懂RectTransform.rect.min和max的同学可以运行看下打印
        // print(dragTarget.rect.min.ToString("0")+"   "+dragTarget.rect.max.ToString("0"));
        //限制范围
        Vector2 min = dragRangeRect.rect.min - dragTarget.rect.min;
        Vector2 max = dragRangeRect.rect.max - dragTarget.rect.max;
        Vector3 pos = dragTarget.localPosition;
        pos.x = Mathf.Clamp(pos.x, min.x, max.x);
        pos.y = Mathf.Clamp(pos.y, min.y, max.y);
        dragTarget.localPosition = pos;
    }
}

限制范围的原理

在这里插入图片描述

谢谢浏览!,如果您觉得本文不错记得关注并分享
欢迎对游戏开发感兴趣的同学,扫描二维码加我微信,一起研究学习
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值