暂无描述
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

ScrollBarClamp.cs 5.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. using UnityEngine.TestTools;
  6. using System.IO;
  7. using System.Reflection;
  8. using NUnit.Framework;
  9. using UnityEngine.EventSystems;
  10. using UnityEditor;
  11. public class ScrollBarClamp : IPrebuildSetup
  12. {
  13. // This test tests that setting scrollBar.value will not be clamped (case 802330 - Scrollbar stops velocity of 'Scroll Rect' unexpectedly)
  14. GameObject m_PrefabRoot;
  15. GameObject m_CameraGO;
  16. const string kPrefabPath = "Assets/Resources/ScrollBarClampPrefab.prefab";
  17. public void Setup()
  18. {
  19. #if UNITY_EDITOR
  20. var rootGO = new GameObject("RootGO");
  21. var rootCanvasGO = new GameObject("Canvas", typeof(Canvas));
  22. var canvas = rootCanvasGO.GetComponent<Canvas>();
  23. canvas.renderMode = RenderMode.ScreenSpaceOverlay;
  24. rootCanvasGO.transform.SetParent(rootGO.transform);
  25. var scrollRectGo = new GameObject("Scroll View", typeof(RectTransform), typeof(ScrollRect), typeof(RectMask2D));
  26. var scrollRectTransform = scrollRectGo.GetComponent<RectTransform>();
  27. scrollRectTransform.SetParent(rootCanvasGO.transform);
  28. scrollRectTransform.anchorMin = Vector2.zero;
  29. scrollRectTransform.anchorMax = Vector2.one;
  30. scrollRectTransform.sizeDelta = Vector2.zero;
  31. scrollRectTransform.anchoredPosition = Vector2.zero;
  32. var scrollRect = scrollRectGo.GetComponent<ScrollRect>();
  33. scrollRect.movementType = ScrollRect.MovementType.Elastic;
  34. var scrollbarGo = new GameObject("Scrollbar", typeof(RectTransform), typeof(Scrollbar));
  35. var scrollbarTransform = scrollbarGo.GetComponent<RectTransform>();
  36. scrollbarTransform.SetParent(scrollRectTransform);
  37. scrollbarTransform.anchorMin = new Vector2(1, 0);
  38. scrollbarTransform.anchorMax = new Vector2(1, 1);
  39. scrollbarTransform.anchoredPosition = Vector2.zero;
  40. scrollbarTransform.pivot = new Vector2(1, 0.5f);
  41. scrollbarTransform.sizeDelta = new Vector2(20, 0);
  42. var scrollbar = scrollbarGo.GetComponent<Scrollbar>();
  43. scrollRect.verticalScrollbar = scrollbar;
  44. var contentGo = new GameObject("Content", typeof(RectTransform), typeof(VerticalLayoutGroup));
  45. var contentTransform = contentGo.GetComponent<RectTransform>();
  46. contentTransform.SetParent(scrollRectTransform);
  47. contentTransform.anchorMin = new Vector2(0, 1);
  48. contentTransform.anchorMax = new Vector2(1, 1);
  49. contentTransform.anchoredPosition = Vector2.zero;
  50. contentTransform.pivot = new Vector2(0.5f, 1);
  51. contentTransform.sizeDelta = new Vector2(0, 1135);
  52. scrollRect.content = contentTransform;
  53. var layoutGroup = contentGo.GetComponent<VerticalLayoutGroup>();
  54. layoutGroup.padding = new RectOffset(10, 10, 0, 0);
  55. layoutGroup.childAlignment = TextAnchor.UpperLeft;
  56. layoutGroup.childControlHeight = true;
  57. layoutGroup.childControlWidth = true;
  58. layoutGroup.childForceExpandHeight = false;
  59. layoutGroup.childForceExpandWidth = false;
  60. for (int i = 0; i < 20; i++)
  61. {
  62. var item = new GameObject("Item" + i, typeof(RectTransform), typeof(LayoutElement));
  63. var itemTransform = item.GetComponent<RectTransform>();
  64. itemTransform.pivot = new Vector2(0.5f, 1);
  65. itemTransform.SetParent(contentTransform);
  66. var layoutElement = item.GetComponent<LayoutElement>();
  67. layoutElement.minWidth = 620;
  68. layoutElement.minHeight = 100;
  69. layoutElement.preferredWidth = 620;
  70. layoutElement.preferredHeight = 100;
  71. }
  72. if (!Directory.Exists("Assets/Resources/"))
  73. Directory.CreateDirectory("Assets/Resources/");
  74. UnityEditor.PrefabUtility.SaveAsPrefabAsset(rootGO, kPrefabPath);
  75. GameObject.DestroyImmediate(rootGO);
  76. #endif
  77. }
  78. [SetUp]
  79. public void TestSetup()
  80. {
  81. m_PrefabRoot = Object.Instantiate(Resources.Load("ScrollBarClampPrefab")) as GameObject;
  82. m_CameraGO = new GameObject("Camera", typeof(Camera));
  83. Canvas.ForceUpdateCanvases();
  84. }
  85. //tests that setting the scrollbar value will not be clamped, but the private scrollbar functions will be clamped
  86. [Test]
  87. public void Scrollbar_clamp()
  88. {
  89. var scrollBar = m_PrefabRoot.GetComponentInChildren<Scrollbar>();
  90. scrollBar.value = 1.5f;
  91. Assert.Greater(scrollBar.value, 1f);
  92. scrollBar.value = -0.5f;
  93. Assert.Less(scrollBar.value, 0f);
  94. MethodInfo method = typeof(Scrollbar).GetMethod("DoUpdateDrag", BindingFlags.NonPublic | BindingFlags.Instance);
  95. method.Invoke(scrollBar, new object[] { new Vector2(1.5f, 1.5f), 1f });
  96. Assert.LessOrEqual(scrollBar.value, 1f);
  97. method.Invoke(scrollBar, new object[] { new Vector2(-0.5f, -0.5f), 1f });
  98. Assert.GreaterOrEqual(scrollBar.value, 0f);
  99. }
  100. [TearDown]
  101. public void TearDown()
  102. {
  103. Object.DestroyImmediate(m_PrefabRoot);
  104. GameObject.DestroyImmediate(m_CameraGO);
  105. }
  106. [OneTimeTearDown]
  107. public void OneTimeTearDown()
  108. {
  109. #if UNITY_EDITOR
  110. AssetDatabase.DeleteAsset(kPrefabPath);
  111. #endif
  112. }
  113. }