在很多游戏中,游戏背包界面内的物品是可以拖动位置的,这就涉及到了UGUI的拖拽事件。 1.三个拖拽事件相关接口: IBeginDragHandler:开始拖拽事件处理器;开始拖拽的一瞬间触发。 IDragHandler:拖拽中事件处理器;拖拽过程中持续触发。 IEndDragHandler:结束拖拽事件处理器;拖拽结束的一瞬间触发。 2.接口使用步骤 ①当前脚本首先需要引入事件命名空间EventSystems; ②在当前类继承的父类的后方,用逗号分隔,写需要使用到接口名; ③鼠标放到接口名上,右键–>实现接口–>实现接口/ 显示实现接口; ④编写相应事件的方法体,先简单输出调试。 3.通过拖拽事件改变图片位置

RectTransformUtility.ScreenPointToWorldPointInRectangle(m_RectTransform, eventData.position, eventData.enterEventCamera,out vec);

RectTransformUtility:RectTransform 工具类; ScreenPointToWorldPointInRectangle:屏幕坐标点转化为世界坐标点; m_RectTransform:游戏物体的RectTransform ; eventData.position:当前坐标位置点; eventData.enterEventCamera:事件摄像机; out vec):最终计算得到的世界坐标位置; 案例:创建一个Image,加入以下脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems; //引入事件命名空间EventSystems
using System;

//添加三个接口
public class Drag : MonoBehaviour,IBeginDragHandler,IDragHandler,IEndDragHandler{

private RectTransform m\_RectTransform;
void Start()
{
    m\_RectTransform = gameObject.GetComponent<RectTransform>();
}

void IBeginDragHandler.OnBeginDrag(PointerEventData eventData)
{
    Debug.Log("开始拖拽");
}

void IDragHandler.OnDrag(PointerEventData eventData)
{
    Debug.Log("拖拽中");
    Vector3 vec;
    RectTransformUtility.ScreenPointToWorldPointInRectangle(m\_RectTransform, eventData.position, eventData.enterEventCamera,out vec);
    m\_RectTransform.position = vec;    //将最终的pos 位置值持续赋值给当前游戏物体的position
}

void IEndDragHandler.OnEndDrag(PointerEventData eventData)
{
    Debug.Log("结束拖拽");
}

}

运行结果,图中的Image在运行后可以拖动位置:[

](http://www.wjgbaby.com/wp-content/uploads/2017/12/17123101-300x197.png)
](http://www.wjgbaby.com/wp-content/uploads/2017/12/17123101-300x197.png)