| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- #if CINEMACHINE_PHYSICS
- using System;
- using System.Collections;
- using NUnit.Framework;
- using UnityEngine;
- using UnityEngine.TestTools;
- using Cinemachine;
- using UnityEngine.TestTools.Utils;
- namespace Tests.Runtime
- {
- public class CmColliderTests : CinemachineFixtureBase
- {
- CinemachineBrain m_Brain;
- CinemachineVirtualCamera m_Vcam;
- CinemachineCollider m_Collider;
- GameObject m_FollowObject;
- [SetUp]
- public override void SetUp()
- {
- var camera = CreateGameObject("MainCamera", typeof(Camera), typeof(CinemachineBrain));
- m_Brain = camera.GetComponent<CinemachineBrain>();
- m_Vcam = CreateGameObject("CM Vcam", typeof(CinemachineVirtualCamera), typeof(CinemachineCollider)).GetComponent<CinemachineVirtualCamera>();
- m_Vcam.Priority = 100;
- m_Vcam.Follow = CreateGameObject("Follow Object").transform;
- var framingTransposer = m_Vcam.AddCinemachineComponent<CinemachineFramingTransposer>();
- framingTransposer.m_CameraDistance = 5f;
- m_Collider = m_Vcam.GetComponent<CinemachineCollider>();
- m_Collider.m_Strategy = CinemachineCollider.ResolutionStrategy.PullCameraForward;
- m_Collider.m_CollideAgainst = 1;
- m_Collider.m_AvoidObstacles = true;
- m_Collider.m_SmoothingTime = 0;
- m_Collider.m_Damping = 0;
- m_Collider.m_DampingWhenOccluded = 0;
- m_Vcam.AddExtension(m_Collider);
-
- base.SetUp();
-
- // Manual update is needed because when waiting for physics frame, we may pass 1-3 frames. Without manual
- // update the test won't be deterministic, because we would update 1-3 times, instead of just once.
- m_Brain.m_UpdateMethod = CinemachineBrain.UpdateMethod.ManualUpdate;
- }
- [UnityTest, ConditionalIgnore("IgnoreHDRPInstability", "This test is unstable on HDRP")]
- public IEnumerator CheckSmoothingTime()
- {
- m_Collider.m_SmoothingTime = 1;
- m_Collider.m_Damping = 0;
- m_Collider.m_DampingWhenOccluded = 0;
- var originalCamPosition = m_Vcam.State.FinalPosition;
- yield return null;
- m_Brain.ManualUpdate();
- Assert.That(originalCamPosition, Is.EqualTo(m_Vcam.State.FinalPosition).Using(Vector3EqualityComparer.Instance));
- var obstacle = GameObject.CreatePrimitive(PrimitiveType.Cube);
- obstacle.transform.position = originalCamPosition; // place obstacle so that camera needs to move
-
- yield return WaitForOnePhysicsFrame();
- m_Brain.ManualUpdate();
-
- // Camera moved check
- Assert.That(originalCamPosition, Is.Not.EqualTo(m_Vcam.State.FinalPosition).Using(Vector3EqualityComparer.Instance));
- Assert.That(new Vector3(0, 0, -4.4f), Is.EqualTo(m_Vcam.State.FinalPosition).Using(Vector3EqualityComparer.Instance));
-
- UnityEngine.Object.Destroy(obstacle);
-
- // wait smoothing time and a frame so that camera move back to its original position
- var timerStart = CinemachineCore.CurrentTime;
- yield return WaitForOnePhysicsFrame();
- do
- {
- m_Brain.ManualUpdate();
- yield return null;
- } while ((CinemachineCore.CurrentTime - timerStart) < m_Collider.m_SmoothingTime);
-
- m_Brain.ManualUpdate();
- Assert.That(originalCamPosition, Is.EqualTo(m_Vcam.State.FinalPosition).Using(Vector3EqualityComparer.Instance));
- }
-
- [UnityTest, ConditionalIgnore("IgnoreHDRPInstability", "This test is unstable on HDRP")]
- public IEnumerator CheckDampingWhenOccluded()
- {
- m_Collider.m_SmoothingTime = 0;
- m_Collider.m_Damping = 0;
- m_Collider.m_DampingWhenOccluded = 1;
- var originalCamPosition = m_Vcam.State.FinalPosition;
-
- yield return null;
- m_Brain.ManualUpdate();
-
- Assert.That(originalCamPosition, Is.EqualTo(m_Vcam.State.FinalPosition).Using(Vector3EqualityComparer.Instance));
- var obstacle = GameObject.CreatePrimitive(PrimitiveType.Cube);
- obstacle.transform.position = originalCamPosition; // place obstacle so that camera needs to move
- yield return WaitForOnePhysicsFrame();
- m_Brain.ManualUpdate();
-
- // we are pulling away from obstacle
- Assert.That(originalCamPosition, Is.Not.EqualTo(m_Vcam.State.FinalPosition).Using(Vector3EqualityComparer.Instance));
- Assert.That(new Vector3(0,0,-4.778574f), Is.EqualTo(m_Vcam.State.FinalPosition).Using(Vector3EqualityComparer.Instance));
-
- var previousPosition = m_Vcam.State.FinalPosition;
- var timerStart = CinemachineCore.CurrentTime;
- do
- {
- m_Brain.ManualUpdate();
- yield return null;
- } while ((CinemachineCore.CurrentTime - timerStart) < 0.5f);
- m_Brain.ManualUpdate();
-
- Assert.That(previousPosition, Is.Not.EqualTo(m_Vcam.State.FinalPosition).Using(Vector3EqualityComparer.Instance));
- Assert.That(new Vector3(0,0,-4.4f), Is.EqualTo(m_Vcam.State.FinalPosition).Using(Vector3EqualityComparer.Instance));
-
- UnityEngine.Object.Destroy(obstacle);
- yield return WaitForOnePhysicsFrame();
- m_Brain.ManualUpdate();
-
- Assert.That(originalCamPosition, Is.EqualTo(m_Vcam.State.FinalPosition).Using(Vector3EqualityComparer.Instance));
- }
-
- [UnityTest, ConditionalIgnore("IgnoreHDRPInstability", "This test is unstable on HDRP")]
- public IEnumerator CheckDamping()
- {
- m_Collider.m_SmoothingTime = 0;
- m_Collider.m_Damping = 1;
- m_Collider.m_DampingWhenOccluded = 0;
- var originalCamPosition = m_Vcam.State.FinalPosition;
- yield return null;
- m_Brain.ManualUpdate();
-
- Assert.That(originalCamPosition, Is.EqualTo(m_Vcam.State.FinalPosition).Using(Vector3EqualityComparer.Instance));
- var obstacle = GameObject.CreatePrimitive(PrimitiveType.Cube);
- obstacle.transform.position = originalCamPosition; // place obstacle so that camera needs to move
- yield return WaitForOnePhysicsFrame();
- m_Brain.ManualUpdate();
-
- // camera moved check
- var obstructedPosition = m_Vcam.State.FinalPosition;
- Assert.That(originalCamPosition, Is.Not.EqualTo(obstructedPosition).Using(Vector3EqualityComparer.Instance));
- // wait another frame to avoid snap - we need to have a previous damp time to avoid snap
- yield return null;
- m_Brain.ManualUpdate();
- Assert.That(obstructedPosition, Is.EqualTo(m_Vcam.State.FinalPosition).Using(Vector3EqualityComparer.Instance));
- UnityEngine.Object.Destroy(obstacle);
-
- yield return WaitForOnePhysicsFrame();
- m_Brain.ManualUpdate();
-
- // camera has moved and it is not yet back at its original position
- var finalPosition = m_Vcam.State.FinalPosition;
- Assert.That(obstructedPosition, Is.Not.EqualTo(finalPosition).Using(Vector3EqualityComparer.Instance));
- Assert.That(originalCamPosition, Is.Not.EqualTo(finalPosition).Using(Vector3EqualityComparer.Instance));
- Assert.That(new Vector3(0, 0, -4.71081734f), Is.EqualTo(finalPosition).Using(Vector3EqualityComparer.Instance));
- }
- }
- }
- #endif
|