using BrewMonster; using Unity.Cinemachine; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; namespace BrewMonster.Scripts { public class InGameGraphicOption : MonoSingleton { [SerializeField] private UniversalRenderPipelineAsset _renderPipelineAsset; [SerializeField] private CinemachineCamera _cinemachineVirtualCamera; private static bool _warnedMissingUpdAsset; private static bool _warnedMissingCinemachineCam; private void TryEnsureRenderPipelineAsset() { if (_renderPipelineAsset != null) { return; } // MonoSingleton creates an empty host when absent from the scene — serialized refs stay null (e.g. animation test scenes). // Fall back to the project Quality / Graphics active URP asset. / 未放场景中时序列化字段为空,回退到当前 URP 资源 _renderPipelineAsset = GraphicsSettings.defaultRenderPipeline as UniversalRenderPipelineAsset; if (_renderPipelineAsset == null && !_warnedMissingUpdAsset) { _warnedMissingUpdAsset = true; BMLogger.LogWarning( "[InGameGraphicOption] UniversalRenderPipelineAsset missing (Inspector + Graphics Settings). SetRenderScale/SetMSAA are no-ops until URP is set."); } } private CinemachineCamera TryResolveCinemachineCamera() { if (_cinemachineVirtualCamera != null) { return _cinemachineVirtualCamera; } _cinemachineVirtualCamera = FindFirstObjectByType(); return _cinemachineVirtualCamera; } #region public functions /// How far the objects are rendered in the scene. /// public void SetRenderDistance(float distance) { var cam = TryResolveCinemachineCamera(); if (cam == null) { if (!_warnedMissingCinemachineCam) { _warnedMissingCinemachineCam = true; BMLogger.LogWarning( "[InGameGraphicOption] No CinemachineCamera — SetRenderDistance skipped (assign _cinemachineVirtualCamera or add a vcam in scene)."); } return; } distance = Mathf.Clamp(distance, 50f, 500f); cam.Lens.FarClipPlane = distance; } /// /// The scale of the render pipeline.
/// The value should be between 0.6 and 1.5. ///
public void SetRenderScale(float scale) { TryEnsureRenderPipelineAsset(); if (_renderPipelineAsset == null) { return; } scale = Mathf.Clamp(scale, 0.6f, 1.5f); _renderPipelineAsset.renderScale = scale; } public void SetMSAA(int msaaLevel) { TryEnsureRenderPipelineAsset(); if (_renderPipelineAsset == null) { return; } // Valid: 0,2,4 if (msaaLevel != 0 && msaaLevel != 2 && msaaLevel != 4) { return; } _renderPipelineAsset.msaaSampleCount = msaaLevel; } //TODO: figure out a solution for this. public void SetActiveShadow(bool active) { } #endregion } }