using UnityEngine; #if UNITY_EDITOR using UnityEditor; #endif namespace Amanotes.Core { public class Screen2D : Widget2D { [SerializeField] [Range(0f, 1f)] private float fitWidthToHeight = 1f; private Vector2 _originalSize; private Vector2 _lastScreenSize; private bool _hasInited; private void Awake() { if (_hasInited) return; _hasInited = true; _originalSize = size; _lastScreenSize = GetCurrentScreenSize(); if (_originalSize == Vector2.zero) return; _size.SetSize(CalculateNewSize(GetCurrentScreenSize())); RefreshComponentsOnly(); } public void Init() { if (!_hasInited) { _hasInited = true; _originalSize = size; _lastScreenSize = GetCurrentScreenSize(); } UpdateScreenSize(); } private void Update() { if (!Application.isPlaying) return; var currentSize = GetCurrentScreenSize(); if (Vector2.Distance(currentSize, _lastScreenSize) > 1f) { _lastScreenSize = currentSize; UpdateScreenSize(); } } #if UNITY_EDITOR private void OnValidate() { if (PrefabUtility.IsPartOfPrefabAsset(gameObject)) return; #pragma warning disable UDR0005 EditorApplication.delayCall += Refresh; #pragma warning restore UDR0005 } #endif private void UpdateScreenSize() { if (_originalSize == Vector2.zero) return; var screenSize = GetCurrentScreenSize(); var newSize = CalculateNewSize(screenSize); size = newSize; Refresh(); } private Vector2 GetCurrentScreenSize() { return new Vector2(Screen.width, Screen.height); } private Vector2 CalculateNewSize(Vector2 screenSize) { var screenAspect = screenSize.x / screenSize.y; var fitWidthSize = new Vector2(_originalSize.x, _originalSize.x / screenAspect); var fitHeightSize = new Vector2(_originalSize.y * screenAspect, _originalSize.y); return Vector2.Lerp(fitWidthSize, fitHeightSize, fitWidthToHeight); } } }