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.
128 lines
5.0 KiB
128 lines
5.0 KiB
using System.IO; |
|
using UnityEngine; |
|
using UnityEngine.UI; |
|
using UnityEngine.TestTools; |
|
using NUnit.Framework; |
|
using System.Collections; |
|
using UnityEditor; |
|
|
|
/* |
|
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. |
|
Test for case (1010178-Clamped ScrollRect with scalling cause a large spike in performance) |
|
*/ |
|
|
|
public class ScrollRectStableLayout : IPrebuildSetup |
|
{ |
|
GameObject m_PrefabRoot; |
|
GameObject m_CameraGO; |
|
|
|
const string kPrefabPath = "Assets/Resources/ScrollRectStableLayoutPrefab.prefab"; |
|
|
|
public void Setup() |
|
{ |
|
#if UNITY_EDITOR |
|
var rootGO = new GameObject("RootGO"); |
|
var rootCanvasGO = new GameObject("Canvas", typeof(Canvas), typeof(CanvasScaler)); |
|
rootCanvasGO.transform.SetParent(rootGO.transform); |
|
var canvas = rootCanvasGO.GetComponent<Canvas>(); |
|
canvas.renderMode = RenderMode.ScreenSpaceOverlay; |
|
var canvasScaler = rootCanvasGO.GetComponent<CanvasScaler>(); |
|
canvasScaler.uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize; |
|
canvasScaler.referenceResolution = new Vector2(3840, 2160); |
|
canvasScaler.referencePixelsPerUnit = 128; |
|
|
|
var scrollRectGo = new GameObject("Scroll View", typeof(ScrollRect)); |
|
var scrollRectTransform = scrollRectGo.GetComponent<RectTransform>(); |
|
scrollRectTransform.SetParent(rootCanvasGO.transform); |
|
scrollRectTransform.localPosition = Vector3.zero; |
|
scrollRectTransform.sizeDelta = new Vector2(1000, 1000); |
|
scrollRectTransform.localScale = Vector3.one * 1.000005f; |
|
var scrollRect = scrollRectGo.GetComponent<ScrollRect>(); |
|
scrollRect.horizontal = true; |
|
scrollRect.vertical = true; |
|
scrollRect.movementType = ScrollRect.MovementType.Clamped; |
|
scrollRect.inertia = true; |
|
|
|
var viewportTransform = new GameObject("Viewport", typeof(RectTransform)).GetComponent<RectTransform>(); |
|
viewportTransform.SetParent(scrollRectTransform); |
|
viewportTransform.localPosition = Vector3.zero; |
|
viewportTransform.localScale = Vector3.one; |
|
viewportTransform.sizeDelta = new Vector2(-17, 0); |
|
viewportTransform.anchorMin = new Vector2(0, 0); |
|
viewportTransform.anchorMax = new Vector2(1, 1); |
|
viewportTransform.pivot = new Vector2(0, 1); |
|
scrollRect.viewport = viewportTransform; |
|
|
|
var contentGo = new GameObject("Content", typeof(GridLayoutGroup)); |
|
var contentTransform = contentGo.GetComponent<RectTransform>(); |
|
contentTransform.SetParent(viewportTransform); |
|
contentTransform.localPosition = Vector3.zero; |
|
contentTransform.localScale = Vector3.one; |
|
contentTransform.sizeDelta = new Vector2(0, 300); |
|
contentTransform.anchorMin = new Vector2(0, 1); |
|
contentTransform.anchorMax = new Vector2(1, 1); |
|
contentTransform.pivot = new Vector2(0, 1); |
|
var gridLayout = contentGo.GetComponent<GridLayoutGroup>(); |
|
gridLayout.cellSize = new Vector2(100, 100); |
|
gridLayout.startCorner = GridLayoutGroup.Corner.UpperLeft; |
|
gridLayout.startAxis = GridLayoutGroup.Axis.Horizontal; |
|
gridLayout.childAlignment = TextAnchor.UpperLeft; |
|
gridLayout.constraint = GridLayoutGroup.Constraint.Flexible; |
|
scrollRect.content = contentTransform; |
|
|
|
for (int i = 0; i < 20; i++) |
|
{ |
|
var go = new GameObject("GameObject (" + i + ")", typeof(RectTransform)); |
|
var t = go.GetComponent<RectTransform>(); |
|
t.SetParent(contentTransform); |
|
t.localScale = Vector3.one; |
|
t.pivot = new Vector2(0.5f, 0.5f); |
|
} |
|
|
|
if (!Directory.Exists("Assets/Resources/")) |
|
Directory.CreateDirectory("Assets/Resources/"); |
|
|
|
UnityEditor.PrefabUtility.SaveAsPrefabAsset(rootGO, kPrefabPath); |
|
GameObject.DestroyImmediate(rootGO); |
|
#endif |
|
} |
|
|
|
[SetUp] |
|
public void TestSetup() |
|
{ |
|
m_PrefabRoot = Object.Instantiate(Resources.Load("ScrollRectStableLayoutPrefab")) as GameObject; |
|
m_CameraGO = new GameObject("Camera", typeof(Camera)); |
|
} |
|
|
|
[UnityTest] |
|
public IEnumerator ScrollRect_StableWhenStatic() |
|
{ |
|
//root->canvas->scroll view->viewport->content |
|
RectTransform t = m_PrefabRoot.transform.GetChild(0).GetChild(0).GetChild(0).GetChild(0) as RectTransform; |
|
float[] values = new float[5]; |
|
for (int i = 0; i < values.Length; i++) |
|
{ |
|
values[i] = t.localPosition.y; |
|
yield return null; |
|
} |
|
Assert.AreEqual(values[0], values[1]); |
|
Assert.AreEqual(values[1], values[2]); |
|
Assert.AreEqual(values[2], values[3]); |
|
Assert.AreEqual(values[3], values[4]); |
|
} |
|
|
|
[TearDown] |
|
public void TearDown() |
|
{ |
|
Object.DestroyImmediate(m_PrefabRoot); |
|
GameObject.DestroyImmediate(m_CameraGO); |
|
} |
|
|
|
[OneTimeTearDown] |
|
public void OneTimeTearDown() |
|
{ |
|
#if UNITY_EDITOR |
|
AssetDatabase.DeleteAsset(kPrefabPath); |
|
#endif |
|
} |
|
}
|
|
|