UI事件之Drag拖拽事件
========================================================
2.UGUI 事件命名空间
当我们需要使用 UGUI 中的事件的时候,需要在脚本内引入专有命名空间:
using UnityEngine.EventSystems;
----------------------------------
2.拖拽相关事件接口
----------------------------------
1.三个拖拽事件相关接口
* IBeginDragHandler: 开始拖拽事件处理器;开始拖拽的一瞬间触发。
* IDragHandler: 拖拽中事件处理器;拖拽过程中持续触发。
* IEndDragHandler: 结束拖拽事件处理器;拖拽结束的一瞬间触发。
----------------------------------
扩展理解:
这种“开始”“持续中”“结束”的模式,在 Unity 的交互中是非常常见的。
我们之前的碰撞检测,触发检测,鼠标和键盘的按键检测,都有这三个状态。
----------------------------------
2.接口使用步骤
①当前脚本首先需要引入事件命名空间 EventSystems;
②在当前类继承的父类的后方,用逗号分隔,写需要使用到接口名;
③鼠标放到接口名上,右键-->实现接口-->实现接口 / 显示实现接口;
④编写相应事件的方法体,先简单输出调试。
----------------------------------
3.通过拖拽事件改变图片位置
RectTransformUtility. / /RectTransform 工具类;
ScreenPointToWorldPointInRectangle( //屏幕坐标点转化为世界坐标点;
m_RectTransform, //游戏物体的 RectTransform ;
eventData.position, //当前坐标位置点;
eventData.enterEventCamera, //事件摄像机;
out pos); //最终计算得到的世界坐标位置;
PointerEventData:指针事件数据。
上面的这个方法我们只需要写在“拖拽中事件”方法内,将最终的 pos 位置值
持续赋值给当前游戏物体的 position 即可,就可以实现拖拽改变图片的位置。
========================================================
实例: 鼠标拖动游戏物体
//获取组件引用
m_RT = gameObject.GetComponent<RectTransform>();
//得到实时坐标位置转化成3D坐标,并返回一个位置变量
RectTransformUtility.ScreenPointToWorldPointInRectangle(m_RT,eventData.position,eventData.enterEventCamera,out pos);
//赋值给游戏物体
m_RT.position = pos;
----------------------------------
总结: 继承接口,实现接口,写入处理代码实现效果。
把下面的代码保存到一个代码文件,拖给一个游戏物体
using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; public class ItemDrag : MonoBehaviour ,IBeginDragHandler,IDragHandler,IEndDragHandler { private RectTransform m_RT; void IBeginDragHandler.OnBeginDrag(PointerEventData eventData) { print("IBeginDragHandler.OnBeginDrag"); gameObject.GetComponent<Transform>().position = Input.mousePosition; print("这是实现的拖拽开始接口"); } void IDragHandler.OnDrag(PointerEventData eventData) { print("IDragHandler.OnDrag"); //虽然用Input.mousePosition可以得到一个2D坐标,不过我们现在需要的是3D坐标,看下面 //gameObject.GetComponent<Transform>().position = Input.mousePosition; //3D坐标获取方法 Vector3 pos; m_RT = gameObject.GetComponent<RectTransform>(); //屏幕坐标到世界坐标 RectTransformUtility.ScreenPointToWorldPointInRectangle(m_RT,eventData.position,eventData.enterEventCamera,out pos); m_RT.position = pos; print("拖拽中……"); } void IEndDragHandler.OnEndDrag(PointerEventData eventData) { print("IEndDragHandler.OnEndDrag"); gameObject.GetComponent<Transform>().position = Input.mousePosition; print("实现的拖拽结束接口"); } }
如有错误,欢迎指出。