CmColliderTests.cs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. #if CINEMACHINE_PHYSICS
  2. using System;
  3. using System.Collections;
  4. using NUnit.Framework;
  5. using UnityEngine;
  6. using UnityEngine.TestTools;
  7. using Cinemachine;
  8. using UnityEngine.TestTools.Utils;
  9. namespace Tests.Runtime
  10. {
  11. public class CmColliderTests : CinemachineFixtureBase
  12. {
  13. CinemachineBrain m_Brain;
  14. CinemachineVirtualCamera m_Vcam;
  15. CinemachineCollider m_Collider;
  16. GameObject m_FollowObject;
  17. [SetUp]
  18. public override void SetUp()
  19. {
  20. var camera = CreateGameObject("MainCamera", typeof(Camera), typeof(CinemachineBrain));
  21. m_Brain = camera.GetComponent<CinemachineBrain>();
  22. m_Vcam = CreateGameObject("CM Vcam", typeof(CinemachineVirtualCamera), typeof(CinemachineCollider)).GetComponent<CinemachineVirtualCamera>();
  23. m_Vcam.Priority = 100;
  24. m_Vcam.Follow = CreateGameObject("Follow Object").transform;
  25. var framingTransposer = m_Vcam.AddCinemachineComponent<CinemachineFramingTransposer>();
  26. framingTransposer.m_CameraDistance = 5f;
  27. m_Collider = m_Vcam.GetComponent<CinemachineCollider>();
  28. m_Collider.m_Strategy = CinemachineCollider.ResolutionStrategy.PullCameraForward;
  29. m_Collider.m_CollideAgainst = 1;
  30. m_Collider.m_AvoidObstacles = true;
  31. m_Collider.m_SmoothingTime = 0;
  32. m_Collider.m_Damping = 0;
  33. m_Collider.m_DampingWhenOccluded = 0;
  34. m_Vcam.AddExtension(m_Collider);
  35. base.SetUp();
  36. // Manual update is needed because when waiting for physics frame, we may pass 1-3 frames. Without manual
  37. // update the test won't be deterministic, because we would update 1-3 times, instead of just once.
  38. m_Brain.m_UpdateMethod = CinemachineBrain.UpdateMethod.ManualUpdate;
  39. }
  40. [UnityTest, ConditionalIgnore("IgnoreHDRPInstability", "This test is unstable on HDRP")]
  41. public IEnumerator CheckSmoothingTime()
  42. {
  43. m_Collider.m_SmoothingTime = 1;
  44. m_Collider.m_Damping = 0;
  45. m_Collider.m_DampingWhenOccluded = 0;
  46. var originalCamPosition = m_Vcam.State.FinalPosition;
  47. yield return null;
  48. m_Brain.ManualUpdate();
  49. Assert.That(originalCamPosition, Is.EqualTo(m_Vcam.State.FinalPosition).Using(Vector3EqualityComparer.Instance));
  50. var obstacle = GameObject.CreatePrimitive(PrimitiveType.Cube);
  51. obstacle.transform.position = originalCamPosition; // place obstacle so that camera needs to move
  52. yield return WaitForOnePhysicsFrame();
  53. m_Brain.ManualUpdate();
  54. // Camera moved check
  55. Assert.That(originalCamPosition, Is.Not.EqualTo(m_Vcam.State.FinalPosition).Using(Vector3EqualityComparer.Instance));
  56. Assert.That(new Vector3(0, 0, -4.4f), Is.EqualTo(m_Vcam.State.FinalPosition).Using(Vector3EqualityComparer.Instance));
  57. UnityEngine.Object.Destroy(obstacle);
  58. // wait smoothing time and a frame so that camera move back to its original position
  59. var timerStart = CinemachineCore.CurrentTime;
  60. yield return WaitForOnePhysicsFrame();
  61. do
  62. {
  63. m_Brain.ManualUpdate();
  64. yield return null;
  65. } while ((CinemachineCore.CurrentTime - timerStart) < m_Collider.m_SmoothingTime);
  66. m_Brain.ManualUpdate();
  67. Assert.That(originalCamPosition, Is.EqualTo(m_Vcam.State.FinalPosition).Using(Vector3EqualityComparer.Instance));
  68. }
  69. [UnityTest, ConditionalIgnore("IgnoreHDRPInstability", "This test is unstable on HDRP")]
  70. public IEnumerator CheckDampingWhenOccluded()
  71. {
  72. m_Collider.m_SmoothingTime = 0;
  73. m_Collider.m_Damping = 0;
  74. m_Collider.m_DampingWhenOccluded = 1;
  75. var originalCamPosition = m_Vcam.State.FinalPosition;
  76. yield return null;
  77. m_Brain.ManualUpdate();
  78. Assert.That(originalCamPosition, Is.EqualTo(m_Vcam.State.FinalPosition).Using(Vector3EqualityComparer.Instance));
  79. var obstacle = GameObject.CreatePrimitive(PrimitiveType.Cube);
  80. obstacle.transform.position = originalCamPosition; // place obstacle so that camera needs to move
  81. yield return WaitForOnePhysicsFrame();
  82. m_Brain.ManualUpdate();
  83. // we are pulling away from obstacle
  84. Assert.That(originalCamPosition, Is.Not.EqualTo(m_Vcam.State.FinalPosition).Using(Vector3EqualityComparer.Instance));
  85. Assert.That(new Vector3(0,0,-4.778574f), Is.EqualTo(m_Vcam.State.FinalPosition).Using(Vector3EqualityComparer.Instance));
  86. var previousPosition = m_Vcam.State.FinalPosition;
  87. var timerStart = CinemachineCore.CurrentTime;
  88. do
  89. {
  90. m_Brain.ManualUpdate();
  91. yield return null;
  92. } while ((CinemachineCore.CurrentTime - timerStart) < 0.5f);
  93. m_Brain.ManualUpdate();
  94. Assert.That(previousPosition, Is.Not.EqualTo(m_Vcam.State.FinalPosition).Using(Vector3EqualityComparer.Instance));
  95. Assert.That(new Vector3(0,0,-4.4f), Is.EqualTo(m_Vcam.State.FinalPosition).Using(Vector3EqualityComparer.Instance));
  96. UnityEngine.Object.Destroy(obstacle);
  97. yield return WaitForOnePhysicsFrame();
  98. m_Brain.ManualUpdate();
  99. Assert.That(originalCamPosition, Is.EqualTo(m_Vcam.State.FinalPosition).Using(Vector3EqualityComparer.Instance));
  100. }
  101. [UnityTest, ConditionalIgnore("IgnoreHDRPInstability", "This test is unstable on HDRP")]
  102. public IEnumerator CheckDamping()
  103. {
  104. m_Collider.m_SmoothingTime = 0;
  105. m_Collider.m_Damping = 1;
  106. m_Collider.m_DampingWhenOccluded = 0;
  107. var originalCamPosition = m_Vcam.State.FinalPosition;
  108. yield return null;
  109. m_Brain.ManualUpdate();
  110. Assert.That(originalCamPosition, Is.EqualTo(m_Vcam.State.FinalPosition).Using(Vector3EqualityComparer.Instance));
  111. var obstacle = GameObject.CreatePrimitive(PrimitiveType.Cube);
  112. obstacle.transform.position = originalCamPosition; // place obstacle so that camera needs to move
  113. yield return WaitForOnePhysicsFrame();
  114. m_Brain.ManualUpdate();
  115. // camera moved check
  116. var obstructedPosition = m_Vcam.State.FinalPosition;
  117. Assert.That(originalCamPosition, Is.Not.EqualTo(obstructedPosition).Using(Vector3EqualityComparer.Instance));
  118. // wait another frame to avoid snap - we need to have a previous damp time to avoid snap
  119. yield return null;
  120. m_Brain.ManualUpdate();
  121. Assert.That(obstructedPosition, Is.EqualTo(m_Vcam.State.FinalPosition).Using(Vector3EqualityComparer.Instance));
  122. UnityEngine.Object.Destroy(obstacle);
  123. yield return WaitForOnePhysicsFrame();
  124. m_Brain.ManualUpdate();
  125. // camera has moved and it is not yet back at its original position
  126. var finalPosition = m_Vcam.State.FinalPosition;
  127. Assert.That(obstructedPosition, Is.Not.EqualTo(finalPosition).Using(Vector3EqualityComparer.Instance));
  128. Assert.That(originalCamPosition, Is.Not.EqualTo(finalPosition).Using(Vector3EqualityComparer.Instance));
  129. Assert.That(new Vector3(0, 0, -4.71081734f), Is.EqualTo(finalPosition).Using(Vector3EqualityComparer.Instance));
  130. }
  131. }
  132. }
  133. #endif