UGUI拖拽和范围限制
实现效果如下
说明:
- 脚本挂Image上的,Iamge是窗口红色标题栏
- Drag3是一个窗口因为测试忘了改名字
- 这个拖拽脚本对于三种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;
}
}
限制范围的原理
谢谢浏览!,如果您觉得本文不错记得关注并分享
欢迎对游戏开发感兴趣的同学,扫描二维码加我微信,一起研究学习