seefood_diet / Assets / Scripts / SDEnvironment.cs
SDEnvironment.cs
Raw
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);
    }
}