• Unity中实现ScrollRect 滚动定位到视口内


    Demo链接:

    https://download.csdn.net/download/qq_41973169/89446832icon-default.png?t=N7T8https://download.csdn.net/download/qq_41973169/89446832

    一、前言

    Unity版本:2020.1.x

    Unity游戏开发中,滚动视图中元素的定位是一个常见需求。为了解决这个问题,我们可以编写一个名为 "ScrollLocate" 的脚本来实现这个功能。

    二、效果 

    三、完整代码

    1. using UnityEngine;
    2. using UnityEngine.UI;
    3. public class ScrollLocate : MonoBehaviour
    4. {
    5. public RectTransform itemTransform;
    6. private ScrollRect _scrollRect;
    7. private RectTransform _contentTransform;
    8. private RectTransform _viewportTransform;
    9. private void Start()
    10. {
    11. _scrollRect = GetComponent();
    12. _contentTransform = _scrollRect.content;
    13. _viewportTransform = _scrollRect.viewport;
    14. }
    15. public void LocateTargetInViewport()
    16. {
    17. // 获取目标RectTransform和viewport的局部坐标边界
    18. Vector3[] itemCorners = new Vector3[4];
    19. itemTransform.GetWorldCorners(itemCorners);
    20. Vector3[] viewportCorners = new Vector3[4];
    21. _viewportTransform.GetWorldCorners(viewportCorners);
    22. // 转换世界坐标到内容局部坐标
    23. for (int i = 0; i < 4; i++)
    24. {
    25. itemCorners[i] = _contentTransform.InverseTransformPoint(itemCorners[i]);
    26. viewportCorners[i] = _contentTransform.InverseTransformPoint(viewportCorners[i]);
    27. }
    28. // 获取边界值
    29. float viewportMinX = viewportCorners[0].x;
    30. float viewportMaxX = viewportCorners[2].x;
    31. float viewportMinY = viewportCorners[0].y;
    32. float viewportMaxY = viewportCorners[2].y;
    33. float itemMinX = itemCorners[0].x;
    34. float itemMaxX = itemCorners[2].x;
    35. float itemMinY = itemCorners[0].y;
    36. float itemMaxY = itemCorners[2].y;
    37. Vector2 contentPosition = _contentTransform.anchoredPosition;
    38. // 水平滚动处理
    39. if (_scrollRect.horizontal)
    40. {
    41. if (itemMaxX > viewportMaxX) // Item超出右边界
    42. {
    43. float difference = itemMaxX - viewportMaxX;
    44. contentPosition.x -= difference;
    45. }
    46. else if (itemMinX < viewportMinX) // Item超出左边界
    47. {
    48. float difference = viewportMinX - itemMinX;
    49. contentPosition.x += difference;
    50. }
    51. }
    52. // 垂直滚动处理
    53. if (_scrollRect.vertical)
    54. {
    55. if (itemMaxY > viewportMaxY) // Item超出上边界
    56. {
    57. float difference = itemMaxY - viewportMaxY;
    58. contentPosition.y -= difference;
    59. }
    60. else if (itemMinY < viewportMinY) // Item超出下边界
    61. {
    62. float difference = viewportMinY - itemMinY;
    63. contentPosition.y += difference;
    64. }
    65. }
    66. _contentTransform.anchoredPosition = contentPosition;
    67. }
    68. private void Update()
    69. {
    70. if (Input.GetKeyDown(KeyCode.Space))
    71. {
    72. LocateTargetInViewport();
    73. }
    74. }
    75. }

    有什么不对的地方或者不明白的地方可以直接问我 

  • 相关阅读:
    第二十章《Java Swing》第5节:常用组件
    C++ 左值引用与一级指针
    【C++风云录】发现天空之美:使用C++库进行气象图像处理与分析
    用正则表达式简单解析JSON字符串
    Retrofit2 完全解析 探索与okhttp之间的关系
    java-net-php-python-jspm校园闲置物品拍卖系统计算机毕业设计程序
    实现一个简单的长轮询
    研发人员如何做好管理
    [附源码]java毕业设计柠檬电动车租赁系统
    小黑子—Maven基础
  • 原文地址:https://blog.csdn.net/qq_41973169/article/details/139711724