zoukankan      html  css  js  c++  java
  • 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("实现的拖拽结束接口");
        }
    }


    如有错误,欢迎指出。
  • 相关阅读:
    人月神话阅读笔记01
    梦断代码阅读笔记03
    构建之法阅读笔记03
    构建之法阅读笔记02
    个人课程总结
    第十六周进度总结
    计算最长英语单词链
    第十五周进度总结
    浪潮之巅阅读笔记03
    冲刺2-10
  • 原文地址:https://www.cnblogs.com/madinglin/p/8470961.html
Copyright © 2011-2022 走看看