RaycastSortingTests.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using NUnit.Framework;
  5. using UnityEditor;
  6. using UnityEngine;
  7. using UnityEngine.EventSystems;
  8. using UnityEngine.TestTools;
  9. using UnityEngine.UI;
  10. public class RaycastSortingTests : IPrebuildSetup
  11. {
  12. // Test to check that a a raycast over two canvases will not use hierarchal depth to compare two results
  13. // from different canvases (case 912396 - Raycast hits ignores 2nd Canvas which is drawn in front)
  14. GameObject m_PrefabRoot;
  15. const string kPrefabPath = "Assets/Resources/RaycastSortingPrefab.prefab";
  16. public void Setup()
  17. {
  18. #if UNITY_EDITOR
  19. var rootGO = new GameObject("RootGO");
  20. var cameraGO = new GameObject("Camera", typeof(Camera));
  21. var camera = cameraGO.GetComponent<Camera>();
  22. cameraGO.transform.SetParent(rootGO.transform);
  23. var eventSystemGO = new GameObject("EventSystem", typeof(EventSystem), typeof(StandaloneInputModule));
  24. eventSystemGO.transform.SetParent(rootGO.transform);
  25. var backCanvasGO = new GameObject("BackCanvas", typeof(Canvas), typeof(GraphicRaycaster));
  26. backCanvasGO.transform.SetParent(rootGO.transform);
  27. var backCanvas = backCanvasGO.GetComponent<Canvas>();
  28. backCanvas.renderMode = RenderMode.ScreenSpaceCamera;
  29. backCanvas.planeDistance = 100;
  30. backCanvas.worldCamera = camera;
  31. var backCanvasBackground = new GameObject("BackCanvasBackground", typeof(RectTransform), typeof(Image));
  32. var backCanvasBackgroundTransform = backCanvasBackground.GetComponent<RectTransform>();
  33. backCanvasBackgroundTransform.SetParent(backCanvasGO.transform);
  34. backCanvasBackgroundTransform.anchorMin = Vector2.zero;
  35. backCanvasBackgroundTransform.anchorMax = Vector2.one;
  36. backCanvasBackgroundTransform.sizeDelta = Vector2.zero;
  37. backCanvasBackgroundTransform.anchoredPosition3D = Vector3.zero;
  38. backCanvasBackgroundTransform.localScale = Vector3.one;
  39. var backCanvasDeeper = new GameObject("BackCanvasDeeperHierarchy", typeof(RectTransform), typeof(Image));
  40. var backCanvasDeeperTransform = backCanvasDeeper.GetComponent<RectTransform>();
  41. backCanvasDeeperTransform.SetParent(backCanvasBackgroundTransform);
  42. backCanvasDeeperTransform.anchorMin = new Vector2(0.5f, 0);
  43. backCanvasDeeperTransform.anchorMax = Vector2.one;
  44. backCanvasDeeperTransform.sizeDelta = Vector2.zero;
  45. backCanvasDeeperTransform.anchoredPosition3D = Vector3.zero;
  46. backCanvasDeeperTransform.localScale = Vector3.one;
  47. backCanvasDeeper.GetComponent<Image>().color = new Color(0.6985294f, 0.7754564f, 1f);
  48. var frontCanvasGO = new GameObject("FrontCanvas", typeof(Canvas), typeof(GraphicRaycaster));
  49. frontCanvasGO.transform.SetParent(rootGO.transform);
  50. var frontCanvas = frontCanvasGO.GetComponent<Canvas>();
  51. frontCanvas.renderMode = RenderMode.ScreenSpaceCamera;
  52. frontCanvas.planeDistance = 50;
  53. frontCanvas.worldCamera = camera;
  54. var frontCanvasTopLevel = new GameObject("FrontCanvasTopLevel", typeof(RectTransform), typeof(Text));
  55. var frontCanvasTopLevelTransform = frontCanvasTopLevel.GetComponent<RectTransform>();
  56. frontCanvasTopLevelTransform.SetParent(frontCanvasGO.transform);
  57. frontCanvasTopLevelTransform.anchorMin = Vector2.zero;
  58. frontCanvasTopLevelTransform.anchorMax = new Vector2(1, 0.5f);
  59. frontCanvasTopLevelTransform.sizeDelta = Vector2.zero;
  60. frontCanvasTopLevelTransform.anchoredPosition3D = Vector3.zero;
  61. frontCanvasTopLevelTransform.localScale = Vector3.one;
  62. var text = frontCanvasTopLevel.GetComponent<Text>();
  63. text.text = "FrontCanvasTopLevel";
  64. text.color = Color.black;
  65. text.fontSize = 97;
  66. if (!Directory.Exists("Assets/Resources/"))
  67. Directory.CreateDirectory("Assets/Resources/");
  68. UnityEditor.PrefabUtility.SaveAsPrefabAsset(rootGO, kPrefabPath);
  69. GameObject.DestroyImmediate(rootGO);
  70. #endif
  71. }
  72. [SetUp]
  73. public void TestSetup()
  74. {
  75. m_PrefabRoot = Object.Instantiate(Resources.Load("RaycastSortingPrefab")) as GameObject;
  76. }
  77. [UnityTest]
  78. public IEnumerator RaycastResult_Sorting()
  79. {
  80. Camera cam = m_PrefabRoot.GetComponentInChildren<Camera>();
  81. EventSystem eventSystem = m_PrefabRoot.GetComponentInChildren<EventSystem>();
  82. GameObject shouldHit = m_PrefabRoot.GetComponentInChildren<Text>().gameObject;
  83. PointerEventData eventData = new PointerEventData(eventSystem);
  84. //bottom left quadrant
  85. eventData.position = cam.ViewportToScreenPoint(new Vector3(0.75f, 0.25f));
  86. List<RaycastResult> results = new List<RaycastResult>();
  87. eventSystem.RaycastAll(eventData, results);
  88. Assert.IsTrue(results[0].gameObject.name == shouldHit.name);
  89. yield return null;
  90. }
  91. [TearDown]
  92. public void TearDown()
  93. {
  94. Object.DestroyImmediate(m_PrefabRoot);
  95. }
  96. [OneTimeTearDown]
  97. public void OneTimeTearDown()
  98. {
  99. #if UNITY_EDITOR
  100. AssetDatabase.DeleteAsset(kPrefabPath);
  101. #endif
  102. }
  103. }