• 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等内置方法

    配对小游戏

     

    1. private bool isFinished;//是否拖到了正确位置
    2.     [SerializeField] private Transform correctTrans;
    3.     private Vector2 startPos;
    4.     // Start is called before the first frame update
    5.     void Start()
    6.     {
    7.         startPos = transform.position;
    8. }
    9. //如果没有拖拽到正确位置,图片在松开鼠标的时候,回到一开始位置
    10.     private void OnMouseDrag()
    11.     {
    12.         if(isFinished==false)
    13.         {//图片跟着鼠标一起移动
    14.             Vector2 cursorPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    15.  
    16.             transform.position = new Vector2(cursorPos.x, cursorPos.y);
    17.         }
    18.     }
    19.     private void OnMouseUp()
    20.     {
    21.   //如果当前拖得图片和对应正确位置足够小,就让当前图片固定到正确位置,否则回到原来位置       if(Mathf.Abs(transform.position.x-correctTrans.position.x)<=0.5f&&Mathf.Abs(transform.position.y-correctTrans.position.y)<=0.5f)
    22.         {
    23.             transform.position = correctTrans.position;
    24.             isFinished = true;
    25.         }
    26.         else
    27.         {
    28.             transform.position = new Vector2(startPos.x, startPos.y);
    29.         }
    30. }

    调整Sorting Layer渲染层顺序

    Event Trigger组件

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

     

    1. private Vector3 startPos;
    2.     void Start()
    3.     {
    4.         startPos = transform.position;
    5.     }
    6.     public void DragMethod()
    7.     {
    8.         transform.position = Input.mousePosition;
    9.         //如果UI模式是ScreenSpace Overlay,可以直接将鼠标位置信息赋值给transform.position
    10.     }
    11.     public void EndDragMethod()
    12.     {
    13.         GameObject slotGo = GameObject.Find("Slot");
    14.         //在所有游戏对象中通过名字查找
    15.         float dist = Vector3.Distance(transform.position, slotGo.transform.position);
    16.         if (dist <= 100)
    17.             transform.position = slotGo.transform.position;
    18.         else
    19.             transform.position = startPos;
    20.     }

    接口

    引用 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();

            canvasGroup = GetComponent();

        }

        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().anchoredPosition = GetComponent().anchoredPosition;

        }    

    }

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

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

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

    窗口小案例

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

     

    1. public class Anli : MonoBehaviour,IBeginDragHandler,IDragHandler
    2. {
    3.     public RectTransform panelRectTrans;
    4.     public void OnBeginDrag(PointerEventData eventData)
    5.     {
    6.         panelRectTrans.SetAsLastSibling();
    7.         //设置为同级最下方的位置
    8.     }
    9.     public void OnDrag(PointerEventData eventData)
    10.     {
    11.         panelRectTrans.anchoredPosition += eventData.delta;
    12.     }
    13. }

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

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

  • 相关阅读:
    C++ Primer Plus习题及答案-第十四章
    Git的使用
    第1章 现代通信网概述
    构造照亮世界——快速沃尔什变换 (FWT)
    vue3的生命周期
    P02014093施豪杰信息论作业
    [H5动画制作系列]帧代码运行顺序测试
    Taichi 加速 Python 中图像处理
    睿趣科技:抖音开小店大概多久可以做起来
    R语言【rgeos】——gSimplify():简化形状
  • 原文地址:https://blog.csdn.net/m0_63330263/article/details/128160198