当前位置:   article > 正文

Unity 自动轮播、滑动轮播_unity 轮播ugui

unity 轮播ugui

如图所示,可设置轮播间隔,可左右滑动进行轮播

1.在UGUI创建个Image,添加自动水平组件

 2.添加并配置脚本

3.代码如下,都有注释

  1. using UnityEngine;
  2. using UnityEngine.UI;
  3. public class IndicatorManager : MonoBehaviour
  4. {
  5. public GameObject indicatorPrefab; // 轮播物体的预制体
  6. public Transform indicatorParent; // 轮播物体的父级对象
  7. private int pageCount = 5; // 页面数量
  8. private GameObject[] indicatorsArray; // 存储所有轮播物体的数组
  9. private int currentPage = 0; // 当前页面索引
  10. private Vector2 slideStartPosition; // 记录滑动的起始点
  11. private bool isSliding = false; // 标志是否正在执行滑动操作
  12. private bool isAutoSlidingPaused = false; // 标志是否暂停自动轮播
  13. private float autoSlideInterval = 3f; // 自动轮播间隔时间
  14. private float autoSlideTimer = 0f; // 计时器,用于自动轮播
  15. private void Start()
  16. {
  17. CreateIndicators();
  18. UpdateIndicators();
  19. }
  20. private void Update()
  21. {
  22. // 更新计时器
  23. UpdateTimer();
  24. // 检测左右滑动手势
  25. DetectSwipe();
  26. }
  27. // 创建页面指示器
  28. private void CreateIndicators()
  29. {
  30. indicatorsArray = new GameObject[pageCount];
  31. for (int i = 0; i < pageCount; i++)
  32. {
  33. GameObject indicator = Instantiate(indicatorPrefab, indicatorParent);
  34. indicatorsArray[i] = indicator;
  35. }
  36. }
  37. // 设置当前页面,并更新页面指示器
  38. private void SetCurrentPage(int pageIndex)
  39. {
  40. currentPage = Mathf.Clamp(pageIndex, 0, pageCount - 1);
  41. UpdateIndicators();
  42. }
  43. // 更新页面指示器的显示状态
  44. private void UpdateIndicators()
  45. {
  46. for (int i = 0; i < pageCount; i++)
  47. {
  48. // 将当前页面的轮播物体颜色设置为白色,其他页面的轮播物体颜色设置为灰色
  49. indicatorsArray[i].GetComponent<Image>().color = (i == currentPage) ? Color.white : new Color(0.5f, 0.5f, 0.5f, 0.5f);
  50. }
  51. }
  52. // 自动轮播方法
  53. private void AutoSlide()
  54. {
  55. // 如果没有正在执行滑动操作且未暂停自动轮播,则切换到下一个页面
  56. if (!isSliding && !isAutoSlidingPaused)
  57. {
  58. SetCurrentPage((currentPage + 1) % pageCount);
  59. }
  60. }
  61. // 检测左右滑动手势
  62. private void DetectSwipe()
  63. {
  64. if (Input.GetMouseButtonDown(0))
  65. {
  66. // 记录滑动的起始点
  67. if (IsInsideParent(Input.mousePosition))
  68. {
  69. slideStartPosition = Input.mousePosition;
  70. }
  71. }
  72. else if (Input.GetMouseButton(0))
  73. {
  74. float deltaX = Input.mousePosition.x - slideStartPosition.x;
  75. // 如果没有正在执行滑动操作且滑动距离足够大,则切换页面
  76. if (!isSliding && !isAutoSlidingPaused && Mathf.Abs(deltaX) > 50f && IsInsideParent(Input.mousePosition))
  77. {
  78. int direction = (deltaX > 0) ? -1 : 1;
  79. SetCurrentPage((currentPage + direction + pageCount) % pageCount);
  80. // 标志为正在执行滑动操作
  81. isSliding = true;
  82. // 暂停自动轮播
  83. PauseAutoSlide();
  84. }
  85. }
  86. else if (Input.GetMouseButtonUp(0))
  87. {
  88. // 重置滑动标志
  89. isSliding = false;
  90. // 恢复自动轮播
  91. ResumeAutoSlide();
  92. }
  93. }
  94. // 判断坐标是否在父物体内
  95. private bool IsInsideParent(Vector2 position)
  96. {
  97. RectTransform parentRect = indicatorParent.GetComponent<RectTransform>();
  98. return RectTransformUtility.RectangleContainsScreenPoint(parentRect, position);
  99. }
  100. // 更新计时器
  101. private void UpdateTimer()
  102. {
  103. // 如果没有正在执行滑动操作且未暂停自动轮播,则更新计时器
  104. if (!isSliding && !isAutoSlidingPaused)
  105. {
  106. autoSlideTimer += Time.deltaTime;
  107. // 如果计时器超过轮播间隔时间,则执行自动轮播
  108. if (autoSlideTimer >= autoSlideInterval)
  109. {
  110. AutoSlide();
  111. // 重置计时器
  112. autoSlideTimer = 0f;
  113. }
  114. }
  115. }
  116. // 暂停自动轮播
  117. private void PauseAutoSlide()
  118. {
  119. isAutoSlidingPaused = true;
  120. }
  121. // 恢复自动轮播,并重置计时器
  122. private void ResumeAutoSlide()
  123. {
  124. isAutoSlidingPaused = false;
  125. autoSlideTimer = 0f;
  126. }
  127. }

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

闽ICP备14008679号