private void UpdateReflectionCamera(Camera realCamera) { if (_reflectionCamera == null) { _reflectionCamera = InitializeReflectionCamera(); } Vector3 pos = Vector3.zero; Vector3 normal = Vector3.up; if (reflectionTarget != null) { pos = reflectionTarget.transform.position + Vector3.up * reflectionPlaneOffset; normal = reflectionTarget.transform.up; } UpdateCamera(realCamera, _reflectionCamera); _reflectionCamera.gameObject.hideFlags = (hideReflectionCamera) ? HideFlags.HideAndDontSave : HideFlags.DontSave; #if UNITY_EDITOR EditorApplication.DirtyHierarchyWindowSorting(); #endif var d = -Vector3.Dot(normal, pos); var reflectionPlane = new Vector4(normal.x, normal.y, normal.z, d); var reflection = Matrix4x4.identity; reflection *= Matrix4x4.Scale(new Vector3(1, -1, 1)); PlanarReflections.CalculateReflectionMatrix(ref reflection, reflectionPlane); var oldPosition = realCamera.transform.position - new Vector3(0, pos.y * 2, 0); var newPosition = PlanarReflections.ReflectPosition(oldPosition); _reflectionCamera.transform.forward = Vector3.Scale(realCamera.transform.forward, new Vector3(1, -1, 1)); _reflectionCamera.worldToCameraMatrix = realCamera.worldToCameraMatrix * reflection; var clipPlane = CameraSpacePlane(_reflectionCamera, pos - Vector3.up * 0.1f, normal, 1.0f); var projection = realCamera.CalculateObliqueMatrix(clipPlane); _reflectionCamera.projectionMatrix = projection; _reflectionCamera.cullingMask = reflectionLayer; _reflectionCamera.transform.position = newPosition; }