UGUI(七)界面拖动和焦点界面

时间:2024-10-14 21:07:08

http://blog.sina.com.cn/s/blog_89d90b7c0102vj9e.html

一般软件和游戏有多窗口多界面时,都可以拖动子界面和排序子界面【点击后变成焦点界面显示在最前面】。如下图:

UGUI的官方例子中有实现拖动的脚本DragPanel,不过它没支持界面排序,加个排序很简单,在按下鼠标时调用tranform的SetSiblingIndex即可,值越大越靠前,在这里我只是简单的实现了这个基本功能,最终用到项目是需要设计一下的,因为很多时候需要记录打开界面的一些信息,在这里就不多说了。

代码如下:

  1. using UnityEngine;
  2. using UnityEngine.UI;
  3. using UnityEngine.EventSystems;
  4. using System.Collections;
  5. public class DragPanel : MonoBehaviour, IPointerDownHandler, IDragHandler {
  6. // 鼠标起点
  7. private Vector2 originalLocalPointerPosition;
  8. // 面板起点
  9. private Vector3 originalPanelLocalPosition;
  10. // 当前面板
  11. private RectTransform panelRectTransform;
  12. // 父节点,这个最好是UI父节点,因为它的矩形大小刚好是屏幕大小
  13. private RectTransform parentRectTransform;
  14. ;
  15. void Awake () {
  16. panelRectTransform = transform.parent as RectTransform;
  17. parentRectTransform = panelRectTransform.parent as RectTransform;
  18. }
  19. // 鼠标按下
  20. public void OnPointerDown (PointerEventData data) {
  21. siblingIndex++;
  22. panelRectTransform.transform.SetSiblingIndex(siblingIndex);
  23. // 记录当前面板起点
  24. originalPanelLocalPosition = panelRectTransform.localPosition;
  25. // 通过屏幕中的鼠标点,获取在父节点中的鼠标点
  26. // parentRectTransform:父节点
  27. // data.position:当前鼠标位置
  28. // data.pressEventCamera:当前事件的摄像机
  29. // originalLocalPointerPosition:获取当前鼠标起点
  30. RectTransformUtility.ScreenPointToLocalPointInRectangle (parentRectTransform, data.position, data.pressEventCamera, out originalLocalPointerPosition);
  31. }
  32. // 拖动
  33. public void OnDrag (PointerEventData data) {
  34. if (panelRectTransform == null || parentRectTransform == null)
  35. return;
  36. Vector2 localPointerPosition;
  37. // 获取本地鼠标位置
  38. if (RectTransformUtility.ScreenPointToLocalPointInRectangle (parentRectTransform, data.position, data.pressEventCamera, out localPointerPosition)) {
  39. // 移动位置 = 本地鼠标当前位置 - 本地鼠标起点位置
  40. Vector3 offsetToOriginal = localPointerPosition - originalLocalPointerPosition;
  41. // 当前面板位置 = 面板起点 + 移动位置
  42. panelRectTransform.localPosition = originalPanelLocalPosition + offsetToOriginal;
  43. }
  44. ClampToWindow ();
  45. }
  46. // 限制当前面板在父节点中的区域位置
  47. void ClampToWindow () {
  48. // 面板位置
  49. Vector3 pos = panelRectTransform.localPosition;
  50. // 如果是UI父节点,设置面板大小为0,那么最大最小位置为正负屏幕的一半
  51. Vector3 minPosition = parentRectTransform.rect.min - panelRectTransform.rect.min;
  52. Vector3 maxPosition = parentRectTransform.rect.max - panelRectTransform.rect.max;
  53. pos.x = Mathf.Clamp (panelRectTransform.localPosition.x, minPosition.x, maxPosition.x);
  54. pos.y = Mathf.Clamp (panelRectTransform.localPosition.y, minPosition.y, maxPosition.y);
  55. panelRectTransform.localPosition = pos;
  56. }
  57. }