private void OnTriggerEnter(Collider other) { if (other.gameObject.layer == CinematicDirector.Instance.Settings.CinematicCameraLayer) { ShakeableCamera camera = other.GetComponent <ShakeableCamera>(); if (camera != null) { OnCollideWithShakeableCamera.Invoke(camera); } } }
private void OnCollideWithShakeableCamera(ShakeableCamera camera) { // Calculate nearest point car will pass by camera. Vector3 nearestExpectedPointToCamera = MathHelper.NearestPointOnLine(transform.position, transform.forward, camera.transform.position); float distanceToCameraAtNearestPoint = Vector3.Distance(nearestExpectedPointToCamera, camera.transform.position); float distanceScaler = Mathf.Clamp01(1f / distanceToCameraAtNearestPoint); float shakeForce = body.velocity.magnitude * shakeScalar; #if UNITY_EDITOR Debug.DrawLine(transform.position, transform.position + transform.forward * 1000f, Color.red, 10f); Debug.DrawLine(nearestExpectedPointToCamera, camera.transform.position, Color.blue, 10f); #endif float distanceToNearestExpectedPointToCamera = Vector3.Distance(transform.position, nearestExpectedPointToCamera); float timeToNearestPoint = distanceToNearestExpectedPointToCamera / body.velocity.magnitude; camera.ShakeCamera(shakeForce, distanceToCameraAtNearestPoint, timeToNearestPoint); }