using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.Events; public class UISaveArea : MonoBehaviour { public static UnityEvent onOrientationChange = new UnityEvent(); public static UnityEvent onResolutionChange = new UnityEvent(); public static bool isLandscape { get; private set; } private static List helpers = new List(); private static bool screenChangeVarsInitialized = false; private static ScreenOrientation lastOrientation = ScreenOrientation.Portrait; private static Vector2 lastResolution = Vector2.zero; private static Rect lastSafeArea = Rect.zero; private Canvas canvas; private RectTransform rectTransform; private RectTransform safeAreaTransform; void Awake() { if (!helpers.Contains(this)) helpers.Add(this); canvas = GetComponent(); rectTransform = GetComponent(); safeAreaTransform = transform as RectTransform; if (!screenChangeVarsInitialized) { lastOrientation = Screen.orientation; lastResolution.x = Screen.width; lastResolution.y = Screen.height; lastSafeArea = Screen.safeArea; screenChangeVarsInitialized = true; } } void Start() { ApplySafeArea(); } void Update() { if (helpers[0] != this) return; if (Application.isMobilePlatform) { if (Screen.orientation != lastOrientation) { OrientationChanged(); SafeAreaChanged(); } if (Screen.safeArea != lastSafeArea) SafeAreaChanged(); } else { //resolution of mobile devices should stay the same always, right? // so this check should only happen everywhere else if (Screen.width != lastResolution.x || Screen.height != lastResolution.y) ResolutionChanged(); } } void ApplySafeArea() { if (safeAreaTransform == null) return; var safeArea = Screen.safeArea; var anchorMin = safeArea.position; var anchorMax = safeArea.position + safeArea.size; // bool IsIphoneXDevice = false; // string modelStr = SystemInfo.deviceModel; //#if UNITY_IOS // // iPhoneX:"iPhone10,3","iPhone10,6" iPhoneXR:"iPhone11,8" iPhoneXS:"iPhone11,2" iPhoneXS Max:"iPhone11,6" // IsIphoneXDevice = modelStr.Equals("iPhone10,3") || modelStr.Equals("iPhone10,6") || modelStr.Equals("iPhone11,8") || modelStr.Equals("iPhone11,2") || modelStr.Equals("iPhone11,6"); //#endif // if (IsIphoneXDevice) // { // if (Screen.orientation == ScreenOrientation.LandscapeLeft) // { // anchorMin = Vector2.zero; // } // else if (Screen.orientation == ScreenOrientation.LandscapeLeft) // { // anchorMax = new Vector2(canvas.pixelRect.width, canvas.pixelRect.height); // } // } anchorMin.x /= canvas.pixelRect.width; //anchorMin.y /= canvas.pixelRect.height; anchorMin.y = 0; anchorMax.x /= canvas.pixelRect.width; //anchorMax.y /= canvas.pixelRect.height; anchorMax.y = 1; safeAreaTransform.anchorMin = anchorMin; safeAreaTransform.anchorMax = anchorMax; // Debug.Log( // "ApplySafeArea:" + // "\n Screen.orientation: " + Screen.orientation + // #if UNITY_IOS // "\n Device.generation: " + UnityEngine.iOS.Device.generation.ToString() + // #endif // "\n Screen.safeArea.position: " + Screen.safeArea.position.ToString() + // "\n Screen.safeArea.size: " + Screen.safeArea.size.ToString() + // "\n Screen.width / height: (" + Screen.width.ToString() + ", " + Screen.height.ToString() + ")" + // "\n canvas.pixelRect.size: " + canvas.pixelRect.size.ToString() + // "\n anchorMin: " + anchorMin.ToString() + // "\n anchorMax: " + anchorMax.ToString()); } void OnDestroy() { if (helpers != null && helpers.Contains(this)) helpers.Remove(this); } private static void OrientationChanged() { //Debug.Log("Orientation changed from " + lastOrientation + " to " + Screen.orientation + " at " + Time.time); lastOrientation = Screen.orientation; lastResolution.x = Screen.width; lastResolution.y = Screen.height; isLandscape = lastOrientation == ScreenOrientation.LandscapeLeft || lastOrientation == ScreenOrientation.LandscapeRight || lastOrientation == ScreenOrientation.Landscape; onOrientationChange.Invoke(); } private static void ResolutionChanged() { if (lastResolution.x == Screen.width && lastResolution.y == Screen.height) return; //Debug.Log("Resolution changed from " + lastResolution + " to (" + Screen.width + ", " + Screen.height + ") at " + Time.time); lastResolution.x = Screen.width; lastResolution.y = Screen.height; isLandscape = Screen.width > Screen.height; onResolutionChange.Invoke(); } private static void SafeAreaChanged() { if (lastSafeArea == Screen.safeArea) return; //Debug.Log("Safe Area changed from " + lastSafeArea + " to " + Screen.safeArea.size + " at " + Time.time); lastSafeArea = Screen.safeArea; for (int i = 0; i < helpers.Count; i++) { helpers[i].ApplySafeArea(); } } public static Vector2 GetCanvasSize() { return helpers[0].rectTransform.sizeDelta; } public static Vector2 GetSafeAreaSize() { for (int i = 0; i < helpers.Count; i++) { if (helpers[i].safeAreaTransform != null) { return helpers[i].safeAreaTransform.sizeDelta; } } return GetCanvasSize(); } }