diff --git a/com.unity.cinemachine/Editor/Editors/CinemachinePixelPerfectEditor.cs b/com.unity.cinemachine/Editor/Editors/CinemachinePixelPerfectEditor.cs index 2bdd71949..88c3e6dbe 100644 --- a/com.unity.cinemachine/Editor/Editors/CinemachinePixelPerfectEditor.cs +++ b/com.unity.cinemachine/Editor/Editors/CinemachinePixelPerfectEditor.cs @@ -13,6 +13,21 @@ public override VisualElement CreateInspectorGUI() #if CINEMACHINE_URP || CINEMACHINE_PIXEL_PERFECT_2_0_3 this.AddMissingCmCameraHelpBox(ux); + + var infoBox = ux.AddChild(new HelpBox( + "This component is driving the Pixel Perfect Camera component on the Unity Camera.", + HelpBoxMessageType.Info)); + var helpBox = ux.AddChild(new HelpBox( + "This component requires an active Pixel Perfect Camera component on the Unity Camera.", + HelpBoxMessageType.Warning)); + + ux.TrackAnyUserActivity(() => + { + var pp = target as CinemachinePixelPerfect; + bool isValid = pp.HasValidPixelPerfectCamera(); + infoBox.SetVisible(isValid && pp.enabled); + helpBox.SetVisible(!isValid); + }); #else ux.Add(new HelpBox("This component is only valid within URP projects", HelpBoxMessageType.Warning)); #endif diff --git a/com.unity.cinemachine/Runtime/Behaviours/CinemachinePixelPerfect.cs b/com.unity.cinemachine/Runtime/Behaviours/CinemachinePixelPerfect.cs index df2c68af9..2cd9ddf7a 100644 --- a/com.unity.cinemachine/Runtime/Behaviours/CinemachinePixelPerfect.cs +++ b/com.unity.cinemachine/Runtime/Behaviours/CinemachinePixelPerfect.cs @@ -2,6 +2,12 @@ #if CINEMACHINE_URP || CINEMACHINE_PIXEL_PERFECT_2_0_3 +#if CINEMACHINE_URP + using PixelPerfectCamera = UnityEngine.Rendering.Universal.PixelPerfectCamera; +#else + using PixelPerfectCamera = UnityEngine.U2D.PixelPerfectCamera; +#endif + namespace Unity.Cinemachine { /// @@ -35,28 +41,33 @@ protected override void PostPipelineStageCallback( if (brain == null || !brain.IsLiveChild(vcam)) return; -#if CINEMACHINE_URP - #if UNITY_2023_2_OR_NEWER - UnityEngine.Rendering.Universal.PixelPerfectCamera pixelPerfectCamera; - #else - UnityEngine.Experimental.Rendering.Universal.PixelPerfectCamera pixelPerfectCamera; - #endif -#elif CINEMACHINE_PIXEL_PERFECT_2_0_3 - UnityEngine.U2D.PixelPerfectCamera pixelPerfectCamera; -#endif - brain.TryGetComponent(out pixelPerfectCamera); - if (pixelPerfectCamera == null || !pixelPerfectCamera.isActiveAndEnabled) + var pixelPerfectCamera = GetPixelPerfectCamera(vcam, true); + if (pixelPerfectCamera == null) return; - #if UNITY_EDITOR if (!UnityEditor.EditorApplication.isPlaying && !pixelPerfectCamera.runInEditMode) return; #endif - var lens = state.Lens; lens.OrthographicSize = pixelPerfectCamera.CorrectCinemachineOrthoSize(lens.OrthographicSize); state.Lens = lens; } + + PixelPerfectCamera GetPixelPerfectCamera(CinemachineVirtualCameraBase vcam, bool liveOnly) + { + var brain = CinemachineCore.FindPotentialTargetBrain(vcam); + if (brain == null || (liveOnly && !brain.IsLiveChild(vcam))) + return null; + var camera = brain.OutputCamera; + if (camera == null || !camera.TryGetComponent(out PixelPerfectCamera pixelPerfectCamera) + || !pixelPerfectCamera.isActiveAndEnabled) + return null; + return pixelPerfectCamera; + } + + // Used by inspector + internal bool HasValidPixelPerfectCamera() + => TryGetComponent(out var vcam) && GetPixelPerfectCamera(vcam, false) != null; } } #else