140 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			140 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | using NUnit.Framework; | ||
|  | using System.Collections.Generic; | ||
|  | using UnityEngine; | ||
|  | using UnityEngine.EventSystems; | ||
|  | using UnityEngine.Rendering; | ||
|  | 
 | ||
|  | public class Physics2DRaycasterTests | ||
|  | { | ||
|  |     GameObject m_CamGO; | ||
|  |     SpriteRenderer m_RedSprite; | ||
|  |     SpriteRenderer m_BlueSprite; | ||
|  |     SpriteRenderer m_GreenSprite; | ||
|  |     EventSystem m_EventSystem; | ||
|  | 
 | ||
|  |     [SetUp] | ||
|  |     public void TestSetup() | ||
|  |     { | ||
|  |         m_CamGO = new GameObject("Physics2DRaycaster Camera"); | ||
|  |         m_CamGO.transform.position = new Vector3(0, 0, -10); | ||
|  |         m_CamGO.transform.LookAt(Vector3.zero); | ||
|  |         var cam = m_CamGO.AddComponent<Camera>(); | ||
|  |         cam.orthographic = true; | ||
|  |         m_CamGO.AddComponent<Physics2DRaycaster>(); | ||
|  |         m_EventSystem = m_CamGO.AddComponent<EventSystem>(); | ||
|  | 
 | ||
|  |         var texture = new Texture2D(64, 64); | ||
|  |         var sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0, 0)); | ||
|  | 
 | ||
|  |         m_RedSprite = CreateTestSprite("Red", Color.red, sprite); | ||
|  |         m_BlueSprite = CreateTestSprite("Blue", Color.blue, sprite); | ||
|  |         m_GreenSprite = CreateTestSprite("Green", Color.green, sprite); | ||
|  |     } | ||
|  | 
 | ||
|  |     static SpriteRenderer CreateTestSprite(string name, Color color, Sprite sprite) | ||
|  |     { | ||
|  |         var go = new GameObject(name); | ||
|  |         var sr = go.AddComponent<SpriteRenderer>(); | ||
|  |         sr.sprite = sprite; | ||
|  |         sr.color = color; | ||
|  |         go.AddComponent<BoxCollider2D>(); | ||
|  |         return sr; | ||
|  |     } | ||
|  | 
 | ||
|  |     [TearDown] | ||
|  |     public void TearDown() | ||
|  |     { | ||
|  |         GameObject.DestroyImmediate(m_CamGO); | ||
|  |         GameObject.DestroyImmediate(m_RedSprite.gameObject); | ||
|  |         GameObject.DestroyImmediate(m_BlueSprite.gameObject); | ||
|  |         GameObject.DestroyImmediate(m_GreenSprite.gameObject); | ||
|  |     } | ||
|  | 
 | ||
|  |     static void AssertRaycastResultsOrder(List<RaycastResult> results, params SpriteRenderer[] expectedOrder) | ||
|  |     { | ||
|  |         Assert.AreEqual(expectedOrder.Length, results.Count); | ||
|  | 
 | ||
|  |         for (int i = 0; i < expectedOrder.Length; ++i) | ||
|  |         { | ||
|  |             Assert.AreSame(expectedOrder[i].gameObject, results[i].gameObject, "Expected {0} at index {1} but got {2}", expectedOrder[i], i, results[i].gameObject); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     List<RaycastResult> PerformRaycast() | ||
|  |     { | ||
|  |         var results = new List<RaycastResult>(); | ||
|  |         var pointerEvent = new PointerEventData(m_EventSystem) | ||
|  |         { | ||
|  |             position = new Vector2(Screen.width / 2f, Screen.height / 2f) | ||
|  |         }; | ||
|  | 
 | ||
|  |         m_EventSystem.RaycastAll(pointerEvent, results); | ||
|  |         return results; | ||
|  |     } | ||
|  | 
 | ||
|  |     [Test] | ||
|  |     public void RaycastAllResultsAreSortedByRendererSortingOrder() | ||
|  |     { | ||
|  |         m_RedSprite.sortingOrder = -10; | ||
|  |         m_BlueSprite.sortingOrder = 0; | ||
|  |         m_GreenSprite.sortingOrder = 5; | ||
|  | 
 | ||
|  |         var results = PerformRaycast(); | ||
|  |         AssertRaycastResultsOrder(results, m_GreenSprite, m_BlueSprite, m_RedSprite); | ||
|  |     } | ||
|  | 
 | ||
|  |     [Test] | ||
|  |     public void RaycastAllResultsAreSortedBySortGroupOrder() | ||
|  |     { | ||
|  |         var blueSg = m_BlueSprite.gameObject.AddComponent<SortingGroup>(); | ||
|  |         blueSg.sortingLayerID = 0; | ||
|  |         blueSg.sortingOrder = -10; | ||
|  | 
 | ||
|  |         var redSg = m_RedSprite.gameObject.AddComponent<SortingGroup>(); | ||
|  |         redSg.sortingLayerID = 0; | ||
|  |         redSg.sortingOrder = 10; | ||
|  | 
 | ||
|  |         SortingGroup.UpdateAllSortingGroups(); | ||
|  | 
 | ||
|  |         var results = PerformRaycast(); | ||
|  |         AssertRaycastResultsOrder(results, m_RedSprite, m_GreenSprite, m_BlueSprite); | ||
|  |     } | ||
|  | 
 | ||
|  |     [Test] | ||
|  |     public void RaycastAllResultsAreSortedBySortGroupOrderAndSortingOrder() | ||
|  |     { | ||
|  |         m_RedSprite.sortingOrder = -10; | ||
|  |         m_BlueSprite.sortingOrder = 0; | ||
|  |         m_GreenSprite.sortingOrder = 5; | ||
|  | 
 | ||
|  |         var sg = m_BlueSprite.gameObject.AddComponent<SortingGroup>(); | ||
|  |         sg.sortingLayerID = 0; | ||
|  |         sg.sortingOrder = 100; | ||
|  |         SortingGroup.UpdateAllSortingGroups(); | ||
|  | 
 | ||
|  |         var results = PerformRaycast(); | ||
|  |         AssertRaycastResultsOrder(results, m_BlueSprite, m_GreenSprite, m_RedSprite); | ||
|  |     } | ||
|  | 
 | ||
|  |     [Test] | ||
|  |     public void RaycastAllResultsAreSortedBySortGroupDistanceAlongRay() | ||
|  |     { | ||
|  |         // Ensure we use the distance along the raycast to sort the results | ||
|  |         var sortingGroupRed = new GameObject("Sorting Group Red", typeof(SortingGroup)); | ||
|  |         var sortingGroupBlue = new GameObject("Sorting Group Blue", typeof(SortingGroup)); | ||
|  |         var sortingGroupGreen = new GameObject("Sorting Group Green", typeof(SortingGroup)); | ||
|  |         sortingGroupRed.transform.position = new Vector3(0, 0, -1); | ||
|  |         sortingGroupBlue.transform.position = new Vector3(1000, 1000, 0); | ||
|  |         sortingGroupGreen.transform.position = new Vector3(0, 0, 1); | ||
|  | 
 | ||
|  |         m_RedSprite.transform.SetParent(sortingGroupRed.transform, true); | ||
|  |         m_BlueSprite.transform.SetParent(sortingGroupBlue.transform, true); | ||
|  |         m_GreenSprite.transform.SetParent(sortingGroupGreen.transform, true); | ||
|  | 
 | ||
|  |         SortingGroup.UpdateAllSortingGroups(); | ||
|  | 
 | ||
|  |         var results = PerformRaycast(); | ||
|  |         AssertRaycastResultsOrder(results, m_RedSprite, m_BlueSprite, m_GreenSprite); | ||
|  |     } | ||
|  | } |