Confiner2DUnitTests.cs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. #if CINEMACHINE_PHYSICS_2D
  2. using System.Collections;
  3. using Cinemachine;
  4. using Cinemachine.Utility;
  5. using NUnit.Framework;
  6. using UnityEngine;
  7. using UnityEngine.TestTools;
  8. using UnityEngine.TestTools.Utils;
  9. namespace Tests.Runtime
  10. {
  11. public class Confiner2DUnitTests : CinemachineFixtureBase
  12. {
  13. Camera m_Cam;
  14. CinemachineVirtualCamera m_Vcam;
  15. CinemachineConfiner2D m_Confiner2D;
  16. [SetUp]
  17. public override void SetUp()
  18. {
  19. m_Cam = CreateGameObject("MainCamera", typeof(Camera), typeof(CinemachineBrain)).GetComponent<Camera>();
  20. var vcamHolder = CreateGameObject("CM Vcam", typeof(CinemachineVirtualCamera), typeof(CinemachineConfiner2D));
  21. m_Vcam = vcamHolder.GetComponent<CinemachineVirtualCamera>();
  22. m_Confiner2D = vcamHolder.GetComponent<CinemachineConfiner2D>();
  23. m_Vcam.Priority = 100;
  24. m_Cam.orthographic = true;
  25. m_Vcam.AddExtension(m_Confiner2D);
  26. m_Vcam.m_Lens.OrthographicSize = UnityVectorExtensions.Epsilon;
  27. base.SetUp();
  28. }
  29. [TearDown]
  30. public override void TearDown()
  31. {
  32. m_Vcam.m_Lens.OrthographicSize = 1;
  33. base.TearDown();
  34. }
  35. static IEnumerable ColliderTestCases
  36. {
  37. get
  38. {
  39. yield return new TestCaseData(new[] {Vector2.left, Vector2.up, Vector2.right, Vector2.down}).SetName("Clockwise").Returns(null);
  40. yield return new TestCaseData(new[] {Vector2.left, Vector2.down, Vector2.right, Vector2.up}).SetName("Counter-Clockwise").Returns(null);
  41. }
  42. }
  43. [UnityTest, TestCaseSource(nameof(ColliderTestCases))]
  44. public IEnumerator Test_SimpleSquareConfiner_OrderIndependent_PolygonCollider2D(Vector2[] testPoints)
  45. {
  46. var polygonCollider2D = CreateGameObject("PolygonCollider2DHolder", typeof(PolygonCollider2D)).GetComponent<PolygonCollider2D>();
  47. m_Confiner2D.m_BoundingShape2D = polygonCollider2D;
  48. m_Confiner2D.m_Damping = 0;
  49. m_Confiner2D.m_MaxWindowSize = 0;
  50. // clockwise
  51. polygonCollider2D.points = testPoints;
  52. m_Confiner2D.InvalidateCache();
  53. m_Vcam.transform.position = Vector3.zero;
  54. yield return null; // wait one frame
  55. Assert.That(m_Vcam.State.CorrectedPosition, Is.EqualTo(Vector3.zero).Using(Vector3EqualityComparer.Instance));
  56. m_Vcam.transform.position = Vector2.left * 2f;
  57. yield return null; // wait one frame
  58. Assert.That((m_Vcam.State.CorrectedPosition - Vector3.left).sqrMagnitude, Is.LessThan(UnityVectorExtensions.Epsilon));
  59. m_Vcam.transform.position = Vector2.up * 2f;
  60. yield return null; // wait one frame
  61. Assert.That((m_Vcam.State.CorrectedPosition - Vector3.up).sqrMagnitude, Is.LessThan(UnityVectorExtensions.Epsilon));
  62. m_Vcam.transform.position = Vector2.right * 2f;
  63. yield return null; // wait one frame
  64. Assert.That((m_Vcam.State.CorrectedPosition - Vector3.right).sqrMagnitude, Is.LessThan(UnityVectorExtensions.Epsilon));
  65. m_Vcam.transform.position = Vector2.down * 2f;
  66. yield return null; // wait one frame
  67. Assert.That((m_Vcam.State.CorrectedPosition - Vector3.down).sqrMagnitude, Is.LessThan(UnityVectorExtensions.Epsilon));
  68. }
  69. #if false
  70. [UnityTest, TestCaseSource(nameof(ColliderTestCases))]
  71. public IEnumerator Test_SimpleSquareConfiner_OrderIndependent_CompositeCollider2D(Vector2[] testPoints)
  72. {
  73. var compositeHolder = CreateGameObject("CompositeCollider2DHolder", typeof(Rigidbody2D), typeof(CompositeCollider2D));
  74. var rigidbody2D = compositeHolder.GetComponent<Rigidbody2D>();
  75. rigidbody2D.bodyType = RigidbodyType2D.Kinematic;
  76. rigidbody2D.isKinematic = true;
  77. rigidbody2D.simulated = false;
  78. var compositeCollider2D = compositeHolder.GetComponent<CompositeCollider2D>();
  79. compositeCollider2D.geometryType = CompositeCollider2D.GeometryType.Polygons;
  80. var polyHolder = CreateGameObject("PolygonCollider2DHolder", typeof(PolygonCollider2D));
  81. polyHolder.transform.parent = compositeHolder.transform;
  82. var polygonCollider2D = polyHolder.GetComponent<PolygonCollider2D>();
  83. #if UNITY_2023_1_OR_NEWER
  84. polygonCollider2D.compositeOperation = Collider2D.CompositeOperation.Merge;
  85. #else
  86. polygonCollider2D.usedByComposite = true;
  87. #endif
  88. m_Confiner2D.m_BoundingShape2D = compositeCollider2D;
  89. m_Confiner2D.m_Damping = 0;
  90. m_Confiner2D.m_MaxWindowSize = 0;
  91. // clockwise
  92. polygonCollider2D.points = testPoints;
  93. m_Confiner2D.InvalidateCache();
  94. m_Vcam.transform.position = Vector3.zero;
  95. yield return null; // wait one frame
  96. Assert.That(m_Vcam.State.CorrectedPosition, Is.EqualTo(Vector3.zero).Using(Vector3EqualityComparer.Instance));
  97. m_Vcam.transform.position = Vector2.left * 2f;
  98. yield return null; // wait one frame
  99. Assert.That((m_Vcam.State.CorrectedPosition - Vector3.left).sqrMagnitude, Is.LessThan(UnityVectorExtensions.Epsilon));
  100. m_Vcam.transform.position = Vector2.up * 2f;
  101. yield return null; // wait one frame
  102. Assert.That((m_Vcam.State.CorrectedPosition - Vector3.up).sqrMagnitude, Is.LessThan(UnityVectorExtensions.Epsilon));
  103. m_Vcam.transform.position = Vector2.right * 2f;
  104. yield return null; // wait one frame
  105. Assert.That((m_Vcam.State.CorrectedPosition - Vector3.right).sqrMagnitude, Is.LessThan(UnityVectorExtensions.Epsilon));
  106. m_Vcam.transform.position = Vector2.down * 2f;
  107. yield return null; // wait one frame
  108. Assert.That((m_Vcam.State.CorrectedPosition - Vector3.down).sqrMagnitude, Is.LessThan(UnityVectorExtensions.Epsilon));
  109. }
  110. #endif
  111. }
  112. }
  113. #endif