在项目开发过程中,经常会遇到的一个需求就是拖拽,而拖拽很好实现,只需要一个脚本就能实现,但难的是如何判断是否拖拽到正确的位置上,一般情况下,我们想到的都是用触发器的方法,但是再实际的开发中,会发现这种方法并不灵敏,经常出现失灵的情况,所以,这一次换一种方法来实现这个检测功能。
一:图片拖拽功能
将此脚本挂载在图片上即可实现简单的拖拽功能。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class ImageDrap : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
private RectTransform rectTransform;
// Start is called before the first frame update
void Start()
{
rectTransform = GetComponent<RectTransform>();
}
public void OnBeginDrag(PointerEventData eventData)
{
Debug.Log("开始拖拽");
}
public void OnDrag(PointerEventData eventData)
{
Vector3 pos;
RectTransformUtility.ScreenPointToWorldPointInRectangle(rectTransform, eventData.position, eventData.enterEventCamera, out pos);
rectTransform.position = pos;
}
public void OnEndDrag(PointerEventData eventData)
{
Debug.Log("结束拖拽");
GetComponent<ImageOverlap>().JudgeOverlap();
}
}
二:判断两个图片是否重叠
在拖拽的图片上挂载上这个脚本,并将拖拽区域赋值给TargetRt。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ImageOverlap : MonoBehaviour
{
private RectTransform rt;
public RectTransform TargetRt;
void Start()
{
rt = GetComponent<RectTransform>();
//JudgeOverlap();
}
/// <summary>
/// 判断是否重叠
/// </summary>
public void JudgeOverlap()
{
Debug.Log("当前是否重叠:" + RectTransToScreenPos(rt, null).Overlaps(RectTransToScreenPos(TargetRt, null)));
}
/// <summary>
/// 相机传入主要取决于rt都画布,如果画布使用camera模式,则传入对应的相机,反之为null,
/// </summary>
/// <param name="rt"></param>
/// <param name="cam"></param>
/// <returns></returns>
public static Rect RectTransToScreenPos(RectTransform rt, Camera cam)
{
Vector3[] corners = new Vector3[4];
rt.GetWorldCorners(corners);
Vector2 v0 = RectTransformUtility.WorldToScreenPoint(cam, corners[0]);
Vector2 v1 = RectTransformUtility.WorldToScreenPoint(cam, corners[2]);
Rect rect = new Rect(v0, v1 - v0);
return rect;
}
}
注意:两个脚本都是挂载在同一个image上的,并且在Canvas上的其他模式上均可适用。
图片上不需要做其他任何设置,