在 Unity UGUI 中实现鼠标拖动图片的功能,其核心原理主要涉及到事件检测、坐标转换以及物体位置更新,下面为你详细介绍整个过程:
- 事件检测
借助 Unity 提供的事件系统来捕捉鼠标的交互动作,特别是鼠标按下、拖动和释放这几个关键事件。要实现此功能,需让脚本继承特定的接口,这些接口定义了相应的事件处理方法。具体如下:
IPointerDownHandler:该接口用于处理鼠标按下事件,当鼠标按下图片时,会触发 OnPointerDown 方法。
IDragHandler:用于处理鼠标拖动事件,在鼠标拖动过程中,会持续调用 OnDrag 方法。
IPointerUpHandler:处理鼠标释放事件,当鼠标释放时,会调用 OnPointerUp 方法。 - 坐标转换
由于鼠标在屏幕上的坐标是屏幕空间坐标,而 UGUI 中的 UI 元素使用的是画布空间坐标,因此需要进行坐标转换,将鼠标的屏幕坐标转换为 UI 元素所在的画布坐标。可以使用 RectTransformUtility.ScreenPointToLocalPointInRectangle 方法来完成这一转换。 - 物体位置更新
在鼠标拖动过程中,根据鼠标的移动量来更新图片的位置。通过计算鼠标在当前帧相对于上一帧的偏移量,将这个偏移量应用到图片的位置上,从而实现图片跟随鼠标移动的效果。
代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
/// <summary>
/// **************************UGUI拖动图片,脚本挂在Image上即可*********************************
/// </summary>
public class TuoDongWuPin : MonoBehaviour, IDragHandler, IBeginDragHandler, IEndDragHandler
{
//需要被实例化的与制体
//public GameObject YuSheWu;
//实例化后的对象
private Image img;
Vector3 offPos;//存储按下鼠标时的图片-鼠标位置差
Vector3 arragedPos; //保存经过整理后的向量,用于图片移动
/// <summary>
/// 开始拖拽的时候
/// </summary>
/// <param name="eventData"></param>
public void OnBeginDrag(PointerEventData eventData)
{
if (RectTransformUtility.ScreenPointToWorldPointInRectangle(transform.GetComponent<RectTransform>(), Input.mousePosition
, eventData.enterEventCamera, out arragedPos))
{
offPos = transform.position - arragedPos;
}
}
/// <summary>
/// 拖拽中
/// </summary>
/// <param name="eventData"></param>
public void OnDrag(PointerEventData eventData)
{
transform.position = offPos + Input.mousePosition;
}
/// <summary>
/// 拖拽结束
/// </summary>
/// <param name="eventData"></param>
public void OnEndDrag(PointerEventData eventData)
{
transform.position = transform.parent.transform.position;
}
}