源码学习网

UGUI事件之Drag拖拽事件

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("实现的拖拽结束接口");
    }
}


如有错误,欢迎指出。
posted @ 2018-02-25 22:28  马丁啉  阅读(...)  评论(...编辑  收藏