No Description
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.

Physics2DRaycasterTests.cs 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. using NUnit.Framework;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.EventSystems;
  5. using UnityEngine.Rendering;
  6. public class Physics2DRaycasterTests
  7. {
  8. GameObject m_CamGO;
  9. SpriteRenderer m_RedSprite;
  10. SpriteRenderer m_BlueSprite;
  11. SpriteRenderer m_GreenSprite;
  12. EventSystem m_EventSystem;
  13. [SetUp]
  14. public void TestSetup()
  15. {
  16. m_CamGO = new GameObject("Physics2DRaycaster Camera");
  17. m_CamGO.transform.position = new Vector3(0, 0, -10);
  18. m_CamGO.transform.LookAt(Vector3.zero);
  19. var cam = m_CamGO.AddComponent<Camera>();
  20. cam.orthographic = true;
  21. m_CamGO.AddComponent<Physics2DRaycaster>();
  22. m_EventSystem = m_CamGO.AddComponent<EventSystem>();
  23. var texture = new Texture2D(64, 64);
  24. var sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0, 0));
  25. m_RedSprite = CreateTestSprite("Red", Color.red, sprite);
  26. m_BlueSprite = CreateTestSprite("Blue", Color.blue, sprite);
  27. m_GreenSprite = CreateTestSprite("Green", Color.green, sprite);
  28. }
  29. static SpriteRenderer CreateTestSprite(string name, Color color, Sprite sprite)
  30. {
  31. var go = new GameObject(name);
  32. var sr = go.AddComponent<SpriteRenderer>();
  33. sr.sprite = sprite;
  34. sr.color = color;
  35. go.AddComponent<BoxCollider2D>();
  36. return sr;
  37. }
  38. [TearDown]
  39. public void TearDown()
  40. {
  41. GameObject.DestroyImmediate(m_CamGO);
  42. GameObject.DestroyImmediate(m_RedSprite.gameObject);
  43. GameObject.DestroyImmediate(m_BlueSprite.gameObject);
  44. GameObject.DestroyImmediate(m_GreenSprite.gameObject);
  45. }
  46. static void AssertRaycastResultsOrder(List<RaycastResult> results, params SpriteRenderer[] expectedOrder)
  47. {
  48. Assert.AreEqual(expectedOrder.Length, results.Count);
  49. for (int i = 0; i < expectedOrder.Length; ++i)
  50. {
  51. Assert.AreSame(expectedOrder[i].gameObject, results[i].gameObject, "Expected {0} at index {1} but got {2}", expectedOrder[i], i, results[i].gameObject);
  52. }
  53. }
  54. List<RaycastResult> PerformRaycast()
  55. {
  56. var results = new List<RaycastResult>();
  57. var pointerEvent = new PointerEventData(m_EventSystem)
  58. {
  59. position = new Vector2(Screen.width / 2f, Screen.height / 2f)
  60. };
  61. m_EventSystem.RaycastAll(pointerEvent, results);
  62. return results;
  63. }
  64. [Test]
  65. public void RaycastAllResultsAreSortedByRendererSortingOrder()
  66. {
  67. m_RedSprite.sortingOrder = -10;
  68. m_BlueSprite.sortingOrder = 0;
  69. m_GreenSprite.sortingOrder = 5;
  70. var results = PerformRaycast();
  71. AssertRaycastResultsOrder(results, m_GreenSprite, m_BlueSprite, m_RedSprite);
  72. }
  73. [Test]
  74. public void RaycastAllResultsAreSortedBySortGroupOrder()
  75. {
  76. var blueSg = m_BlueSprite.gameObject.AddComponent<SortingGroup>();
  77. blueSg.sortingLayerID = 0;
  78. blueSg.sortingOrder = -10;
  79. var redSg = m_RedSprite.gameObject.AddComponent<SortingGroup>();
  80. redSg.sortingLayerID = 0;
  81. redSg.sortingOrder = 10;
  82. SortingGroup.UpdateAllSortingGroups();
  83. var results = PerformRaycast();
  84. AssertRaycastResultsOrder(results, m_RedSprite, m_GreenSprite, m_BlueSprite);
  85. }
  86. [Test]
  87. public void RaycastAllResultsAreSortedBySortGroupOrderAndSortingOrder()
  88. {
  89. m_RedSprite.sortingOrder = -10;
  90. m_BlueSprite.sortingOrder = 0;
  91. m_GreenSprite.sortingOrder = 5;
  92. var sg = m_BlueSprite.gameObject.AddComponent<SortingGroup>();
  93. sg.sortingLayerID = 0;
  94. sg.sortingOrder = 100;
  95. SortingGroup.UpdateAllSortingGroups();
  96. var results = PerformRaycast();
  97. AssertRaycastResultsOrder(results, m_BlueSprite, m_GreenSprite, m_RedSprite);
  98. }
  99. [Test]
  100. public void RaycastAllResultsAreSortedBySortGroupDistanceAlongRay()
  101. {
  102. // Ensure we use the distance along the raycast to sort the results
  103. var sortingGroupRed = new GameObject("Sorting Group Red", typeof(SortingGroup));
  104. var sortingGroupBlue = new GameObject("Sorting Group Blue", typeof(SortingGroup));
  105. var sortingGroupGreen = new GameObject("Sorting Group Green", typeof(SortingGroup));
  106. sortingGroupRed.transform.position = new Vector3(0, 0, -1);
  107. sortingGroupBlue.transform.position = new Vector3(1000, 1000, 0);
  108. sortingGroupGreen.transform.position = new Vector3(0, 0, 1);
  109. m_RedSprite.transform.SetParent(sortingGroupRed.transform, true);
  110. m_BlueSprite.transform.SetParent(sortingGroupBlue.transform, true);
  111. m_GreenSprite.transform.SetParent(sortingGroupGreen.transform, true);
  112. SortingGroup.UpdateAllSortingGroups();
  113. var results = PerformRaycast();
  114. AssertRaycastResultsOrder(results, m_RedSprite, m_BlueSprite, m_GreenSprite);
  115. }
  116. }