using System.Collections.Generic; using UnityEngine; namespace BlueWater { public class AspectRatioController : MonoBehaviour { [SerializeField] private List _canvasRectTransforms = new(); private float _targetAspect = 16f / 9f; private void OnPreCull() { GL.Clear(true, true, Color.black); } private void Awake() { _canvasRectTransforms.Add(SceneController.Instance.Panel.GetComponent()); EventManager.OnChangedDisplay += ChangeResolution; } private void OnDestroy() { EventManager.OnChangedDisplay -= ChangeResolution; } private float GetScaleHeight() { return ((float)Screen.width / Screen.height) / _targetAspect; } private void SetCamera() { Camera mainCamera = Camera.main; Rect cameraRect = mainCamera.rect; float scaleHeight = GetScaleHeight(); float scaleWidth = 1f / scaleHeight; if (scaleHeight < 1f) { cameraRect.height = scaleHeight; cameraRect.y = (1f - scaleHeight) / 2f; } else { cameraRect.width = scaleWidth; cameraRect.x = (1f - scaleWidth) / 2f; } mainCamera.rect = cameraRect; } private void AdjustUI() { float scaleHeight = GetScaleHeight(); foreach (var element in _canvasRectTransforms) { if (scaleHeight < 1f) { element.anchorMin = new Vector2(0f, (1f - scaleHeight) / 2f); element.anchorMax = new Vector2(1f, 1f - (1f - scaleHeight) / 2f); } else { float scaleWidth = 1f / scaleHeight; element.anchorMin = new Vector2((1f - scaleWidth) / 2f, 0f); element.anchorMax = new Vector2(1f - (1f - scaleWidth) / 2f, 1f); } element.offsetMin = Vector2.zero; element.offsetMax = Vector2.zero; } } public void ChangeResolution() { AdjustUI(); SetCamera(); } } }