当前位置:   article > 正文

Unity 基础 之 IDragHanlder 简单实现 UGUI 元素随着鼠标移动,拖动的效果_idraghandler

idraghandler

 

 

Unity 基础 之 IDragHanlder 多种方法简单实现  UGUI 元素随着鼠标移动,拖动的效果

 

目录

Unity 基础 之 IDragHanlder 多种方法简单实现  UGUI 元素随着鼠标移动,拖动的效果

一、简单介绍

二、实现原理

三、注意实现

四、效果预览

五、实现步骤

六、多种方法实现拖拽 UI

方法一:RectTransformUtility.ScreenPointToWorldPointInRectangle

方法二 :RectTransformUtility.ScreenPointToWorldPointInRectangle 并带位移 offset

方法三:RectTransformUtility.ScreenPointToLocalPointInRectangle 并带位移 Offset

方法四:Camera.WorldToScreenPoint 和  Camera.WorldToScreenPoint  并带位移 Offset


 

一、简单介绍

Unity中的一些基础知识点。

本节介绍,使用 IDraHandler ,简单的就实现 UGUI 元素,随着鼠标的移动而移动的效果。

 

二、实现原理

1、IBeginDragHandler, IDragHandler, IEndDragHandler 三个接口,进行实现拖拽的功能

2、RectTransformUtility.ScreenPointToWorldPointInRectangle 或者  RectTransformUtility.ScreenPointToLocalPointInRectangle

进行坐标转化,实现拖拽

3、必要的再结合 Camera.WorldToScreenPoint 和 Camera.ScreenToWorldPoint 一起实现拖拽移动效果

 

三、注意实现

1、根据 Canvas 的 Render Mode 不同的拖拽方法,移动的效果可能会略有不同,择需使用即可

 

四、效果预览

 

五、实现步骤

1、打开 Unity,新建一个空工程

 

2、在场景中搭建UI,布局如下

 

3、新建脚本,编辑方法移动 UI,把脚本对应赋值

 

六、多种方法实现拖拽 UI

方法一:RectTransformUtility.ScreenPointToWorldPointInRectangle

1、代码如下

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.EventSystems;
  5. public class DragHandlerUGUI : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
  6. {
  7. private RectTransform rectTransform;
  8. // Start is called before the first frame update
  9. void Start()
  10. {
  11. rectTransform = GetComponent<RectTransform>();
  12. }
  13. public void OnBeginDrag(PointerEventData eventData)
  14. {
  15. Debug.Log("开始拖拽");
  16. }
  17. public void OnDrag(PointerEventData eventData)
  18. {
  19. Vector3 pos;
  20. RectTransformUtility.ScreenPointToWorldPointInRectangle(rectTransform, eventData.position, eventData.enterEventCamera, out pos);
  21. rectTransform.position = pos;
  22. }
  23. public void OnEndDrag(PointerEventData eventData)
  24. {
  25. Debug.Log("结束拖拽");
  26. }
  27. }

2、效果如下

 

方法二 :RectTransformUtility.ScreenPointToWorldPointInRectangle 并带位移 offset

1、代码如下

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.EventSystems;
  5. public class DragHandlerUGUI : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
  6. {
  7. private RectTransform rectTransform;
  8. private Vector3 pos; //控件初始位置
  9. private Vector3 mousePos; //鼠标初始位置
  10. private void Start()
  11. {
  12. rectTransform = GetComponent<RectTransform>();
  13. }
  14. public void OnBeginDrag(PointerEventData eventData)
  15. {
  16. Debug.Log("开始拖拽");
  17. pos = this.GetComponent<RectTransform>().position;
  18. RectTransformUtility.ScreenPointToWorldPointInRectangle(rectTransform, eventData.position, eventData.pressEventCamera, out mousePos);
  19. }
  20. public void OnDrag(PointerEventData eventData)
  21. {
  22. Vector3 newVec;
  23. RectTransformUtility.ScreenPointToWorldPointInRectangle(rectTransform, eventData.position, eventData.pressEventCamera, out newVec);
  24. Vector3 offset = new Vector3(newVec.x - mousePos.x, newVec.y - mousePos.y, 0);
  25. rectTransform.position = pos + offset;
  26. }
  27. public void OnEndDrag(PointerEventData eventData)
  28. {
  29. Debug.Log("结束拖拽");
  30. }
  31. }

 

2、效果如下

 

方法三:RectTransformUtility.ScreenPointToLocalPointInRectangle 并带位移 Offset

1、代码如下

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.EventSystems;
  5. public class DragHandlerUGUI : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
  6. {
  7. private Vector3 pos; //控件初始位置
  8. private Vector2 mousePos; //鼠标初始位置
  9. private RectTransform canvasRec; //控件所在画布
  10. private void Start()
  11. {
  12. canvasRec = this.GetComponentInParent<Canvas>().transform as RectTransform;
  13. }
  14. public void OnBeginDrag(PointerEventData eventData)
  15. {
  16. Debug.Log("开始拖拽");
  17. //控件所在画布空间的初始位置
  18. pos = this.GetComponent<RectTransform>().anchoredPosition;
  19. //将屏幕空间鼠标位置eventData.position转换为鼠标在画布空间的鼠标位置
  20. RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasRec, eventData.position, eventData.pressEventCamera, out mousePos);
  21. }
  22. public void OnDrag(PointerEventData eventData)
  23. {
  24. Vector2 newVec;
  25. RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasRec, eventData.position, eventData.pressEventCamera, out newVec);
  26. //鼠标移动在画布空间的位置增量
  27. Vector3 offset = new Vector3(newVec.x - mousePos.x, newVec.y - mousePos.y, 0);
  28. //原始位置增加位置增量即为现在位置
  29. (this.transform as RectTransform).anchoredPosition = pos + offset;
  30. }
  31. public void OnEndDrag(PointerEventData eventData)
  32. {
  33. Debug.Log("结束拖拽");
  34. }
  35. }

 

2、效果如下

 

方法四:Camera.WorldToScreenPoint 和  Camera.WorldToScreenPoint  并带位移 Offset

1、代码如下

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.EventSystems;
  5. public class DragHandlerUGUI : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
  6. {
  7. Vector3 uiScreenPosition;
  8. Vector3 mouseScreenPosition;
  9. Vector3 mScreenPosition;
  10. private Vector3 offset;
  11. Camera mCamera;
  12. // Start is called before the first frame update
  13. void Start()
  14. {
  15. mCamera = Camera.main;
  16. }
  17. public void OnBeginDrag(PointerEventData eventData)
  18. {
  19. Debug.Log("开始拖拽");
  20. //转换对象到当前屏幕位置
  21. uiScreenPosition = mCamera.WorldToScreenPoint(transform.position);
  22. mouseScreenPosition = mCamera.WorldToScreenPoint(eventData.position);
  23. //鼠标屏幕坐标
  24. mScreenPosition = new Vector3(mouseScreenPosition.x, mouseScreenPosition.y, uiScreenPosition.z);
  25. //获得鼠标和对象之间的偏移量,拖拽时相机应该保持不动
  26. offset = transform.position - mCamera.ScreenToWorldPoint(mScreenPosition);
  27. }
  28. public void OnDrag(PointerEventData eventData)
  29. {
  30. mouseScreenPosition = mCamera.WorldToScreenPoint(eventData.position);
  31. //鼠标屏幕上新位置
  32. mScreenPosition = new Vector3(mouseScreenPosition.x, mouseScreenPosition.y, uiScreenPosition.z);
  33. // 对象新坐标
  34. transform.position = offset + mCamera.ScreenToWorldPoint(mScreenPosition);
  35. }
  36. public void OnEndDrag(PointerEventData eventData)
  37. {
  38. Debug.Log("结束拖拽");
  39. }
  40. }

 

2、效果如下

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/567310
推荐阅读
相关标签
  

闽ICP备14008679号