Unity常用的三种拖拽方法(内置方法 + 接口 + Event Trigger组件)

Posted 小小数媒成员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity常用的三种拖拽方法(内置方法 + 接口 + Event Trigger组件)相关的知识,希望对你有一定的参考价值。


目录

内置方法OnMouseDrag【对象含有Collider组件】

配对小游戏

Event Trigger组件

接口

窗口小案例


内置方法OnMouseDrag【对象含有Collider组件】

OnMOuseOver()检测鼠标是否进入到这个2D贴图

当鼠标进入或离开2D贴图,会相应的放大、缩小

private void OnMouseEnter()

    

        transform.localScale += Vector3.one * 0.1f;

    

    private void OnMouseExit()

    

        transform.localScale -= Vector3.one * 0.1f;

经验:只会在2D场景贴图和3D场景中使用OnMouseDrag等内置方法

配对小游戏

 

​
private bool isFinished;//是否拖到了正确位置

    [SerializeField] private Transform correctTrans;

    private Vector2 startPos;

    // Start is called before the first frame update

    void Start()

    

        startPos = transform.position;



//如果没有拖拽到正确位置,图片在松开鼠标的时候,回到一开始位置

    private void OnMouseDrag()

    

        if(isFinished==false)

        //图片跟着鼠标一起移动

            Vector2 cursorPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);



 

            transform.position = new Vector2(cursorPos.x, cursorPos.y);

        

    

    private void OnMouseUp()

    

  //如果当前拖得图片和对应正确位置足够小,就让当前图片固定到正确位置,否则回到原来位置       if(Mathf.Abs(transform.position.x-correctTrans.position.x)<=0.5f&&Mathf.Abs(transform.position.y-correctTrans.position.y)<=0.5f)

        

            transform.position = correctTrans.position;

            isFinished = true;

        

        else

        

            transform.position = new Vector2(startPos.x, startPos.y);

        



​

调整Sorting Layer渲染层顺序

Event Trigger组件

Event Trigger—>Add New Event Type根据不同的事件类型实现不同的交互效果

 

private Vector3 startPos;

    void Start()

    

        startPos = transform.position;

    

    public void DragMethod()

    

        transform.position = Input.mousePosition;

        //如果UI模式是ScreenSpace Overlay,可以直接将鼠标位置信息赋值给transform.position

    

    public void EndDragMethod()

    

        GameObject slotGo = GameObject.Find("Slot");

        //在所有游戏对象中通过名字查找

        float dist = Vector3.Distance(transform.position, slotGo.transform.position);

        if (dist <= 100)

            transform.position = slotGo.transform.position;

        else

            transform.position = startPos;

    

接口

引用 using UnityEngine.EventSystems命名空间

接口中方法没有方法体的,接口的成员,也都是(隐式的)public公共类

使用这个接口必须将接口中未实现的方法加以实现

有关Drag的接口,BeginDrag,EndDrag,IDrag

BeginDrag和EndDrag要在有IDrag的基础上

public class Move : MonoBehaviour,IBeginDragHandler,IEndDragHandler,IDragHandler

    private RectTransform rectTrans;

    private CanvasGroup canvasGroup;

    void Start()

    

        rectTrans = GetComponent<RectTransform>();

        canvasGroup = GetComponent<CanvasGroup>();

    

    public void OnDrag(PointerEventData eventData)

    

        rectTrans.anchoredPosition += eventData.delta;

        //获取这个UI图片相对于Anchor锚点的位置坐标信息

        //eventData.delta自从上一次Update,用户拖着这个对象所移动的2D位置坐标信息      

    

    public void OnBeginDrag(PointerEventData eventData)

    

        canvasGroup.blocksRaycasts = false;

        canvasGroup.alpha = 0.5f;

    

    public void OnEndDrag(PointerEventData eventData)

    

        canvasGroup.blocksRaycasts = true;

        canvasGroup.alpha = 1f;

    

表示在刚开始拖拽的整个过程中,鼠标不会在去把这个UI物体当作阻挡物,

保证拖拽物品到槽的上方时,鼠标能顺利的去忽略这个UI物体

Canvas Group组件  管理这一物体包括它的子物体的所有UI对象(透明度,可交互,是否遮挡等属性)

鼠标只有放在槽上方的时候松开,才能判断拖拽的物体在槽内还是槽外

,IDrapHander 在松开物品后被调用,若没有调用,槽被上一层所拖拽的UI对象所遮罩了,无法获取到鼠标何时松开Drop的操作

public class Slot : MonoBehaviour,IDropHandler

    public void OnDrop(PointerEventData eventData)

    

        eventData.pointerDrag.GetComponent<RectTransform>().anchoredPosition = GetComponent<RectTransform>().anchoredPosition;

        

eventData.pointerDrag直接获取鼠标当前拖拽的这个游戏对象

若鼠标和拖拽的点的位置偏离过大

,去检查Canvas画布中Scale数值是否为1

窗口小案例

通过接口实现针对不同的UI面板窗口,进行拖拽的功能,并且点击的窗口会显示在UI的最高层

 

public class Anli : MonoBehaviour,IBeginDragHandler,IDragHandler



    public RectTransform panelRectTrans;

    public void OnBeginDrag(PointerEventData eventData)

    

        panelRectTrans.SetAsLastSibling();

        //设置为同级最下方的位置

    

    public void OnDrag(PointerEventData eventData)

    

        panelRectTrans.anchoredPosition += eventData.delta;

    

【盘点】Unity常用的三种拖拽方法(内置方法 + 接口 + Event Trigger组件)_哔哩哔哩_bilibili

【仅当学习笔记,若有冒犯,必删】

关于Unity中UGUI 图片实现拖拽功能

应用方法:将下面脚本挂载在需要拖拽功能的UI图片上即可

两种拖拽选择:A.中心拖拽(图片中心跟随鼠标位置)m_isPrecision为false;

       B.精准拖拽(图片被鼠标点击的位置跟随鼠标位置)m_isPrecision为true;

 1 /*************************************************
 2  * 项目名称:UGUI通用
 3  * 脚本创建人:魔卡
 4  * 脚本创建时间:2017.12.14
 5  * 脚本功能:UI图片拖拽功能(将脚本挂载在需要拖放的图片上)
 6  * ***********************************************/
 7 using UnityEngine;
 8 using System.Collections;
 9 using UnityEngine.EventSystems;
10 
11 //UI图片拖拽功能类
12 public class UIDragByMocha : MonoBehaviour,IBeginDragHandler, IDragHandler, IEndDragHandler
13 {
14     [Header( "是否精准拖拽")]
15     public bool m_isPrecision;
16 
17     //存储图片中心点与鼠标点击点的偏移量
18     private Vector3 m_offset;
19 
20     //存储当前拖拽图片的RectTransform组件
21     private RectTransform m_rt;
22     void Start()
23     {
24         //初始化
25         m_rt= gameObject.GetComponent<RectTransform>();
26     }
27 
28     //开始拖拽触发
29     public void OnBeginDrag(PointerEventData eventData)
30     {
31         //如果精确拖拽则进行计算偏移量操作
32         if (m_isPrecision)
33         {
34             // 存储点击时的鼠标坐标
35             Vector3 tWorldPos;
36             //UI屏幕坐标转换为世界坐标
37             RectTransformUtility.ScreenPointToWorldPointInRectangle(m_rt, eventData.position, eventData.pressEventCamera, out tWorldPos);
38             //计算偏移量   
39             m_offset = transform.position - tWorldPos;
40         }
41             //否则,默认偏移量为0
42         else
43         {
44             m_offset = Vector3.zero;
45         }
46 
47         SetDraggedPosition(eventData);
48     }
49 
50     //拖拽过程中触发
51     public void OnDrag(PointerEventData eventData)
52     {
53         SetDraggedPosition(eventData);
54     }
55 
56     //结束拖拽触发
57     public void OnEndDrag(PointerEventData eventData)
58     {
59         SetDraggedPosition(eventData);
60     }
61 
62     /// <summary>
63     /// 设置图片位置方法
64     /// </summary>
65     /// <param name="eventData"></param>
66     private void SetDraggedPosition(PointerEventData eventData)
67     {
68         //存储当前鼠标所在位置
69         Vector3 globalMousePos;
70         //UI屏幕坐标转换为世界坐标
71         if (RectTransformUtility.ScreenPointToWorldPointInRectangle(m_rt, eventData.position, eventData.pressEventCamera, out globalMousePos))
72         {
73             //设置位置及偏移量
74             m_rt.position = globalMousePos + m_offset;
75         }
76     }
77 }

 

以上是关于Unity常用的三种拖拽方法(内置方法 + 接口 + Event Trigger组件)的主要内容,如果未能解决你的问题,请参考以下文章

线程间通信常用的三种方法

unity基础交互入门(按钮点击事件的三种方法)

Unity中获取物体的尺寸(size)的三种方法

Unity鼠标带动物体运动的三种方法

100个 Unity实用技能| Unity读取本地文件(Json,txt等)的三种方法示例

100个 Unity实用技能| Unity读取本地文件(Json,txt等)的三种方法示例