using System; using UniRx; using UnityEngine; using UnityEngine.Events; using UnityEngine.SceneManagement; public struct SDSafeAreaInset { public float Top; public float Bottom; public int Height; } public class SDEnvironment { float m_UnitToActualPixels; public float UnitToActualPixels { get { return m_UnitToActualPixels; } } float m_Width; public float Width { get { return m_Width; } } float m_Height; public float Height { get { return m_Height; } } SDSafeAreaInset m_SafeAreaInset; public SDSafeAreaInset SafeAreaInset { get { return m_SafeAreaInset; } } private static readonly SDEnvironment m_Instance = new SDEnvironment (); public static SDEnvironment Default { get { return m_Instance; } } static SDEnvironment () { } private SDEnvironment () { m_Width = SDConstants.DESIGN_WIDTH; m_UnitToActualPixels = (float) Screen.width / m_Width; m_Height = (float) Screen.height / m_UnitToActualPixels; Observable.FromEvent<UnityAction<Scene, LoadSceneMode>, Tuple<Scene, LoadSceneMode>> ( h => (x, y) => h (Tuple.Create (x, y)), h => SceneManager.sceneLoaded += h, h => SceneManager.sceneLoaded -= h ) .Subscribe (_ => RefreshSafeArea ()); } public void RefreshSafeArea () { var area = Screen.safeArea; m_SafeAreaInset.Top = (Screen.height - area.size.y - area.y) / m_UnitToActualPixels; m_SafeAreaInset.Bottom = area.y / m_UnitToActualPixels; m_SafeAreaInset.Height = Mathf.CeilToInt (area.height / m_UnitToActualPixels); } }