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


    如有错误,欢迎指出。
  • 相关阅读:
    .net注册iis
    hdu 1081To The Max
    hdu 1312Red and Black
    hdu 1016Prime Ring Problem
    hdu 1159Common Subsequence
    hdu 1372Knight Moves
    hdu 1686Oulipo
    hdu 1241Oil Deposits
    hdu 1171Big Event in HDU
    hdu 4006The kth great number
  • 原文地址:https://www.cnblogs.com/madinglin/p/8470961.html
Copyright © 2011-2022 走看看