Нема описа
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ScrollRectStableLayout.cs 5.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. using System.IO;
  2. using UnityEngine;
  3. using UnityEngine.UI;
  4. using UnityEngine.TestTools;
  5. using NUnit.Framework;
  6. using System.Collections;
  7. using UnityEditor;
  8. /*
  9. This test checks if a clamped scrollRect with a content rect that has the same width and a canvas with scaling will stay stable for 5 frames.
  10. Test for case (1010178-Clamped ScrollRect with scalling cause a large spike in performance)
  11. */
  12. public class ScrollRectStableLayout : IPrebuildSetup
  13. {
  14. GameObject m_PrefabRoot;
  15. GameObject m_CameraGO;
  16. const string kPrefabPath = "Assets/Resources/ScrollRectStableLayoutPrefab.prefab";
  17. public void Setup()
  18. {
  19. #if UNITY_EDITOR
  20. var rootGO = new GameObject("RootGO");
  21. var rootCanvasGO = new GameObject("Canvas", typeof(Canvas), typeof(CanvasScaler));
  22. rootCanvasGO.transform.SetParent(rootGO.transform);
  23. var canvas = rootCanvasGO.GetComponent<Canvas>();
  24. canvas.renderMode = RenderMode.ScreenSpaceOverlay;
  25. var canvasScaler = rootCanvasGO.GetComponent<CanvasScaler>();
  26. canvasScaler.uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize;
  27. canvasScaler.referenceResolution = new Vector2(3840, 2160);
  28. canvasScaler.referencePixelsPerUnit = 128;
  29. var scrollRectGo = new GameObject("Scroll View", typeof(ScrollRect));
  30. var scrollRectTransform = scrollRectGo.GetComponent<RectTransform>();
  31. scrollRectTransform.SetParent(rootCanvasGO.transform);
  32. scrollRectTransform.localPosition = Vector3.zero;
  33. scrollRectTransform.sizeDelta = new Vector2(1000, 1000);
  34. scrollRectTransform.localScale = Vector3.one * 1.000005f;
  35. var scrollRect = scrollRectGo.GetComponent<ScrollRect>();
  36. scrollRect.horizontal = true;
  37. scrollRect.vertical = true;
  38. scrollRect.movementType = ScrollRect.MovementType.Clamped;
  39. scrollRect.inertia = true;
  40. var viewportTransform = new GameObject("Viewport", typeof(RectTransform)).GetComponent<RectTransform>();
  41. viewportTransform.SetParent(scrollRectTransform);
  42. viewportTransform.localPosition = Vector3.zero;
  43. viewportTransform.localScale = Vector3.one;
  44. viewportTransform.sizeDelta = new Vector2(-17, 0);
  45. viewportTransform.anchorMin = new Vector2(0, 0);
  46. viewportTransform.anchorMax = new Vector2(1, 1);
  47. viewportTransform.pivot = new Vector2(0, 1);
  48. scrollRect.viewport = viewportTransform;
  49. var contentGo = new GameObject("Content", typeof(GridLayoutGroup));
  50. var contentTransform = contentGo.GetComponent<RectTransform>();
  51. contentTransform.SetParent(viewportTransform);
  52. contentTransform.localPosition = Vector3.zero;
  53. contentTransform.localScale = Vector3.one;
  54. contentTransform.sizeDelta = new Vector2(0, 300);
  55. contentTransform.anchorMin = new Vector2(0, 1);
  56. contentTransform.anchorMax = new Vector2(1, 1);
  57. contentTransform.pivot = new Vector2(0, 1);
  58. var gridLayout = contentGo.GetComponent<GridLayoutGroup>();
  59. gridLayout.cellSize = new Vector2(100, 100);
  60. gridLayout.startCorner = GridLayoutGroup.Corner.UpperLeft;
  61. gridLayout.startAxis = GridLayoutGroup.Axis.Horizontal;
  62. gridLayout.childAlignment = TextAnchor.UpperLeft;
  63. gridLayout.constraint = GridLayoutGroup.Constraint.Flexible;
  64. scrollRect.content = contentTransform;
  65. for (int i = 0; i < 20; i++)
  66. {
  67. var go = new GameObject("GameObject (" + i + ")", typeof(RectTransform));
  68. var t = go.GetComponent<RectTransform>();
  69. t.SetParent(contentTransform);
  70. t.localScale = Vector3.one;
  71. t.pivot = new Vector2(0.5f, 0.5f);
  72. }
  73. if (!Directory.Exists("Assets/Resources/"))
  74. Directory.CreateDirectory("Assets/Resources/");
  75. UnityEditor.PrefabUtility.SaveAsPrefabAsset(rootGO, kPrefabPath);
  76. GameObject.DestroyImmediate(rootGO);
  77. #endif
  78. }
  79. [SetUp]
  80. public void TestSetup()
  81. {
  82. m_PrefabRoot = Object.Instantiate(Resources.Load("ScrollRectStableLayoutPrefab")) as GameObject;
  83. m_CameraGO = new GameObject("Camera", typeof(Camera));
  84. }
  85. [UnityTest]
  86. public IEnumerator ScrollRect_StableWhenStatic()
  87. {
  88. //root->canvas->scroll view->viewport->content
  89. RectTransform t = m_PrefabRoot.transform.GetChild(0).GetChild(0).GetChild(0).GetChild(0) as RectTransform;
  90. float[] values = new float[5];
  91. for (int i = 0; i < values.Length; i++)
  92. {
  93. values[i] = t.localPosition.y;
  94. yield return null;
  95. }
  96. Assert.AreEqual(values[0], values[1]);
  97. Assert.AreEqual(values[1], values[2]);
  98. Assert.AreEqual(values[2], values[3]);
  99. Assert.AreEqual(values[3], values[4]);
  100. }
  101. [TearDown]
  102. public void TearDown()
  103. {
  104. Object.DestroyImmediate(m_PrefabRoot);
  105. GameObject.DestroyImmediate(m_CameraGO);
  106. }
  107. [OneTimeTearDown]
  108. public void OneTimeTearDown()
  109. {
  110. #if UNITY_EDITOR
  111. AssetDatabase.DeleteAsset(kPrefabPath);
  112. #endif
  113. }
  114. }