using System.IO; using UnityEngine; using UnityEngine.TestTools; using NUnit.Framework; using System.Collections; using UnityEngine.UI; using UnityEditor; public class ScrollRectScale : IPrebuildSetup { const string kPrefabPath = "Assets/Resources/ScrollRectScalePrefab.prefab"; public void Setup() { #if UNITY_EDITOR var rootGO = new GameObject("Canvas", typeof(Canvas), typeof(CanvasScaler)); rootGO.transform.SetParent(rootGO.transform); var rootGOTransform = rootGO.transform as RectTransform; rootGOTransform.anchoredPosition3D = new Vector3(679, -122, 783); rootGOTransform.sizeDelta = new Vector2(1165, 765); rootGOTransform.localRotation = Quaternion.Euler(20, 30, 0); var bodyGO = new GameObject("Body", typeof(RectTransform), typeof(Image), typeof(ScrollRect)); bodyGO.transform.SetParent(rootGO.transform); var bodyGORectTransform = bodyGO.transform as RectTransform; bodyGORectTransform.localRotation = Quaternion.identity; bodyGORectTransform.anchorMin = Vector2.zero; bodyGORectTransform.anchorMax = Vector2.one; bodyGORectTransform.localPosition = Vector3.zero; bodyGORectTransform.anchoredPosition = new Vector2(8, -8); bodyGORectTransform.sizeDelta = new Vector2(-16, -16); bodyGORectTransform.pivot = new Vector2(0, 1); var sizer = new GameObject("Sizer", typeof(RectTransform)); var sizerTransform = sizer.transform as RectTransform; sizerTransform.SetParent(bodyGO.transform); sizerTransform.localRotation = Quaternion.identity; sizerTransform.sizeDelta = new Vector2(1149, 3700); sizerTransform.anchoredPosition3D = Vector3.zero; sizerTransform.anchorMin = new Vector2(0, 1); sizerTransform.anchorMax = new Vector2(0, 1); sizerTransform.pivot = new Vector2(0, 1); var bodyGOScrollRect = bodyGO.GetComponent(); bodyGOScrollRect.content = sizerTransform; bodyGOScrollRect.movementType = ScrollRect.MovementType.Clamped; bodyGOScrollRect.decelerationRate = 0.135f; for (int i = 0; i < 19; ++i) { var row = new GameObject("Row" + i, typeof(Image)); var rowTransform = row.transform as RectTransform; rowTransform.SetParent(sizer.transform); rowTransform.localRotation = Quaternion.identity; rowTransform.anchorMin = new Vector2(0, 1); rowTransform.anchorMax = new Vector2(0, 1); rowTransform.pivot = new Vector2(0, 1); rowTransform.sizeDelta = new Vector2(1149, 37); rowTransform.anchoredPosition3D = new Vector3(0, i * -37, 0); } if (!Directory.Exists("Assets/Resources/")) Directory.CreateDirectory("Assets/Resources/"); UnityEditor.PrefabUtility.SaveAsPrefabAsset(rootGO, kPrefabPath); GameObject.DestroyImmediate(rootGO); #endif } GameObject m_CanvasGO; [SetUp] public void TestSetup() { m_CanvasGO = Object.Instantiate(Resources.Load("ScrollRectScalePrefab")) as GameObject; } [UnityTest] [Description("Rect Transform position values are set to NaN, when Rect Transform is created via script and canvas is scaled to 0.01(case 893559)")] public IEnumerator SmallScaleDoesNotCauseInvalidContentPosition() { var canvas = m_CanvasGO.GetComponent(); var scrollRect = canvas.GetComponentInChildren(); var contentRt = scrollRect.content.GetComponent(); var contentLocalPosition = contentRt.localPosition; var rt = canvas.GetComponent(); rt.localScale = new Vector3(0.1f, 0.1f, 0.1f); yield return null; Assert.AreEqual(contentLocalPosition.x, contentRt.localPosition.x, 0.001f); Assert.AreEqual(contentLocalPosition.y, contentRt.localPosition.y, 0.001f); Assert.AreEqual(contentLocalPosition.z, contentRt.localPosition.z, 0.001f); } [TearDown] public void TearDown() { GameObject.DestroyImmediate(m_CanvasGO); #if UNITY_EDITOR AssetDatabase.DeleteAsset(kPrefabPath); #endif } }